Как вы справляетесь с неспособностью передать список cl_mem в вызов ядра? - PullRequest
3 голосов
/ 28 июля 2011

Есть много реальных причин, по которым вы хотели бы сделать это. Наша причина в том, что у нас есть список структур данных переменной длины, и мы хотим иметь возможность изменять размер одного из элементов без повторного их копирования.

Вот несколько вещей, которые я пробовал:

  1. Просто есть много аргументов ядра. Конечно, звучит глупо, но работает для маленькой буквы N. На самом деле это то, что мы делаем.
  2. Do 1) с каким-то макроциклом, который расширяет аргументы ядра до максимального размера (который, я думаю, зависит от устройства). Я действительно не хочу этого делать ... это звучит плохо.
  3. Создайте какой-то список структур, которые содержат указатели, и заполните его перед вызовом ядра. Я попробовал это, и я думаю, что это нарушает спецификации. Согласно тому, что я видел на форумах nVidia, сохранение адреса указателя устройства за пределами одного вызова ядра является незаконным. Если кто-то может указать, где в спецификации написано это, я бы хотел знать, потому что я не могу его найти. Однако это определенно нарушает работу оборудования ATI, поскольку оно перемещает объекты.
  4. Откажитесь, храните объекты переменного размера в большом массиве и напишите умный алгоритм, чтобы использовать пустое пространство, чтобы весь массив должен был переформатироваться реже. Это будет работать, но это не сложный, сложный дизайн. Кроме того, это требует много страшных арифметических указателей ...

У кого-нибудь еще есть другие идеи? Как насчет опыта, пытающегося сделать это; есть какой-нибудь хакерский способ? Почему?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2014

В дополнение к варианту ответа sharpnelis 5:

Если объекты имеют одинаковый размер, вы можете использовать объединения на максимально возможном размере объекта.Но убедитесь, что вы используете явное выравнивание.Передайте второй буфер, идентифицирующий объединение, используемое в каждом объекте, в вашем буфере переменных-размеров-объектов-в-статическом-размере-объединения.

Я вернулся к этому при использовании кода lib opencl, который допускал только один массив переменныхпроизвольный тип.Я просто использовал cl_float2, чтобы пройти два поплавка.Поскольку типы cl_floatN реализованы как объединения, то то, что работает для типов сборки, будет работать и для вас.

0 голосов
/ 28 июля 2011

К 3: Страница спецификации OpenCL 1.1 193 говорит: «Аргументы функций ядра в программе не могут быть объявлены как указатель на указатель (и)».

Структура, содержащая указатель на указатель (указатель наобъект-буфер) может быть не против строгого чтения этого предложения, но это в духе: указатели на объекты-буферы не могут передаваться в качестве аргументов из кода хоста в ядро, даже если они скрыты внутри определенной пользователем структуры.

Я бы выбрал вариант 5: не использовать структуры данных переменного размера.Если у вас есть какой-либо способ сделать их постоянными по размеру, обязательно сделайте это.Это сделает вашу жизнь намного проще.Если быть точным, то здесь нет «структуры переменного размера».Каждое определение структуры создает структуры постоянного размера, поэтому, если размер изменился, изменилась и сама структура, и, следовательно, требуется другой объект mem.Каждый указатель, передаваемый в функцию ядра, должен иметь один тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...