2017-01-10 2 views
0

У меня есть код OpenCL C++, работающий на платформе Intel. У меня есть идея, что указатели не принимаются внутри структуры на конечности ядра. Тем не менее, у меня есть класс, который использует опцию Self-Referencing Pointer внутри него. Теперь я могу использовать структуру и реплицировать ее для структуры на стороне хоста, но я не могу сделать то же самое со стороны устройства.Самоуправляющий указатель в OpenCL

Например следующим образом:

Class Classname{ 
    Classname *SameClass_Selfreferencingpointer; 
    } 
On the Host side I have done the same for the structure as well: 
    struct Structurename{ 
    Structurename *SameStructure_Selfreferencingpointer; 
    } 

Может кто-то дать альтернативный вариант для этой реализации на стороне устройства?
Благодарим за любую помощь заранее.

ответ

1

Поскольку в opencl-устройстве нет malloc, а также структуры используются в буферах как массив структур, вы можете добавить его индекс, чтобы он знал, где он находится в массиве. Вы можете выделить большой буфер перед ядром, а затем использовать атомарные функции для увеличения фальшивого указателя malloc, как если бы он выделял из буфера, а просто возвращал целое число, указывающее на последний «выделенный» структурный индекс. Тогда сторона хоста будет использовать индекс вместо указателя.

Если выравнивание структуры становится проблемой между хостом, вы можете добавить индексирование полей. Такие, как начальный байт поля A, начальный байт поля B, все уплотняются в одном 4-байтовом целое для структуры, имеющей 4 используемых поля, кроме индексов.

Может быть, вы можете добавить этап препроцессирования:

  • хозяина пишет искусственное число в таких областях, как 3.1415
  • проверки устройств с плавающей точкой в ​​структурах для всех смещений байт до тех пор, пока не найдет 3.1415
  • устройства помещает найденное смещение байта в массив и отправляет его на хост
  • , тогда хост пишет поплавковые поля в структуре, начиная с этого смещения байтов
  • так, что хост и устройство станут выравниванием совместимый, использует то же смещение во всех ядер, которые получают на структуру от хозяина

может быть, напротив, лучше

  • устройство ставит 3.14 в поле структуры
  • устройство записывает-структуру в массив структуры
  • хозяин получает буфер
  • проверки хоста для 3,14 и находит смещение байта
  • хост пишет и номер Fp, начиная с этим смещением для будущая работа

, которому потребуется как ваш класс, так и его реплицированная структура на стороне хоста + устройства.

Вы также должны искать «sycl api».

+1

OpenCL KMA предоставляет функции malloc() и free(). См. Блог Бена Гастера и реализацию Goyub Роя Сплита: (https://github.com/RSpliet/KMA) –

+1

Если sycl работает с этим, возможно, возможно более расслабленный C++? –

+0

ComputeCpp - это реализация SYCL, если вы хотите попробовать это. Он доступен по адресу https://www.codeplay.com/products/computesuite/computecpp –

Смежные вопросы