Как структурировать большие ядра OpenCL?

Я работал с OpenCL над парой проектов, но всегда писал ядро ​​как одну (иногда довольно большую) функцию. Сейчас я работаю над более сложным проектом и хотел бы разделить функции между несколькими ядрами.

Но все примеры, которые я могу найти, показывают ядро ​​​​в виде одного файла (очень немногие даже вызывают вторичные функции). Кажется, что должна быть возможность использовать несколько файлов - clCreateProgramWithSource() принимает несколько строк (и, я полагаю, объединяет их) - хотя Program() pyopencl принимает только один источник.

Поэтому хотелось бы услышать от тех, у кого есть опыт:

  • Есть ли проблемы, связанные с несколькими исходными файлами?
  • Является ли лучший обходной путь для pyopencl простым объединением файлов?
  • Есть ли способ скомпилировать библиотеку функций (вместо того, чтобы передавать исходный код библиотеки с каждым ядром, даже если используются не все)?
  • Если необходимо каждый раз передавать исходный код библиотеки, отбрасываются ли неиспользуемые функции (без накладных расходов)?
  • Любые другие лучшие практики/предложения?

Спасибо.


person andrew cooke    schedule 01.10.2011    source источник
comment
Вы можете создать один конкатенационный файл, содержащий #include part1.cl #include part2.cl. Это работает для меня (компилятор NVidia), хотя, вероятно, все компилируется при каждом запуске приложения. Я думаю, что наличие библиотеки предварительно скомпилированных функций — это немного фантастика, поскольку код функции встраивается в каждое ядро ​​(поэтому вы не можете писать рекурсивные функции).   -  person Radim Vansa    schedule 02.10.2011


Ответы (2)


Я не думаю, что в OpenCL есть концепция нескольких исходных файлов в программе — программа — это одна единица компиляции. Однако вы можете использовать #include и извлекать заголовки или другие файлы .cl во время компиляции.

Вы можете иметь несколько ядер в программе OpenCL, поэтому после одной компиляции вы можете вызвать любое из набора скомпилированных ядер.

Можно предположить, что любой неиспользуемый код — функции или что-либо, что статически известно как недостижимое — удаляется во время компиляции с небольшими затратами времени компиляции.

person grrussel    schedule 06.10.2011
comment
благодаря. это то, что я делаю. но, к сожалению, pyopencl не учитывает содержимое #include при кэшировании ядер. поэтому изменение файлов библиотеки не влияет на скомпилированные ядра без ручного удаления кеша. в любом случае, я подожду, чтобы увидеть, есть ли у кого-нибудь идея получше, прежде чем отметить вас как лучшего (и единственного!). ваше здоровье. - person andrew cooke; 06.10.2011
comment
Если это так, то синтаксис clCreateProgramWithSource довольно неуклюж, не так ли? Для этого явно требуется несколько строк и длина каждой из этих строк. Я не уверен, что это действительно работает (я пришел сюда, пытаясь заставить его работать), но звучит странно, что это не может работать, учитывая синтаксис... - person user1111929; 15.02.2012

В OpenCL 1.2 вы связываете разные объектные файлы вместе.

person Yoav    schedule 25.01.2012