Попытка смешать OpenCL с CUDA в шаблоне NVIDIA SDK

Мне было трудно настроить эксперимент, в котором я выделяю память с помощью CUDA на устройстве, беру этот указатель на память на устройстве, использую его в OpenCL и возвращаю результаты. Я хочу посмотреть, возможно ли это. Мне было трудно заставить проект CUDA работать, поэтому я просто использовал проект шаблона Nvidia в их SDK. В make-файле я добавил -lOpenCL в раздел libs файла common.mk. Когда я это делаю, все в порядке, но когда я добавляю #include <CL/cl.h> в template.cu, чтобы начать делать вызовы OpenCL, я получаю более 100 ошибок. Все они выглядят примерно так, но с разными именами функций в конце:

/usr/lib/gcc/x86_64-linux-gnu/4.4.1/include/xmmintrin.h(334): ошибка: идентификатор "__builtin_ia32_cmpeqps" не определен

Мне трудно понять, почему. Пожалуйста, помоги, если можешь. Кроме того, если есть более простой способ настроить проект, который сможет вызывать API CUDA и OpenCL, дайте мне знать.


person smuggledPancakes    schedule 06.10.2010    source источник
comment
Зачем смешивать CUDA и OpenCL?   -  person Dr. Snoopy    schedule 06.10.2010
comment
Я работаю над проектом OpenCL (должен быть OpenCL) в Ubuntu, и мне нужна библиотека, такая как cufft, которая доступна только в CUDA. Я планирую использовать это как краткосрочное решение, пока что-то вроде библиотеки Apple OpenCL FFT не будет перенесено в Ubuntu или какая-либо другая библиотека fft не будет доступна для OpenCL в Ubuntu.   -  person smuggledPancakes    schedule 07.10.2010


Ответы (1)


Я действительно не работал с cuda, поэтому не знаю, насколько полезен мой ответ.

Насколько я понимаю, вы пытаетесь использовать opencl непосредственно из своего хост-кода cuda, который, если я правильно помню, скомпилирован с использованием какого-то компилятора от nvidia вместо стандартного gcc. Таким образом, проблема, вероятно, в том, что этот компилятор не реализует необходимые встроенные функции для работы с упомянутыми заголовками. Посмотрите здесь похожую проблему и ее решение: http://forums.nvidia.com/lofiversion/index.php?t88573.html

Кажется, вам нужно поместить все, что требует opencl api, в другой (не cuda) модуль компиляции, чтобы он был скомпилирован компилятором, отличным от nvidia.

Однако я бы не стал рассчитывать на эту работу (поскольку буферы opencl являются не просто указателями на память, но должны содержать некоторые метаинформации), просто потому, что нет реальной причины, по которой это должно работать, и если это так, нет гарантии, что это продолжится сделать это.

Что вы можете попробовать, если вы действительно хотите, так это использовать opengl для взаимодействия, поскольку и opencl, и cuda имеют расширения, позволяющие создавать буферы из буферов opengl.

Однако зачем вам это нужно? Что мешает вам использовать реализацию Apple в краткосрочной перспективе, поскольку IIRC имеет открытый исходный код, и большая часть его (части opencl) в любом случае должна быть независимой от платформы.

person Grizzly    schedule 07.10.2010
comment
Мне нравится ваша идея использования буферов OpenGL, кажется, я слышал об этом раньше. Кажется, это гораздо более безопасный способ сделать это. Я посмотрел ссылку, которую вы разместили, похоже, что обертки будут работать, и я попробую, так как не могу придумать ничего другого. В настоящее время мы используем cufft, потому что мы можем получить к нему доступ через JCUDA, а затем, поскольку он работает на Java, мы можем запускать нашу программу на компьютере с Linux, Mac или Windows. С библиотекой FFT от Apple нам пришлось бы портировать ее самостоятельно, чтобы сделать ее доступной через JOCL, что мейнтейнер уже выразил заинтересованность сделать сам. - person smuggledPancakes; 07.10.2010