Tentando misturar o OpenCL com Cuda no modelo SDK da NVIDIA
Pergunta
Estou tendo dificuldades para configurar um experimento em que alquei memória com CUDA no dispositivo, pego esse ponteiro para a memória no dispositivo, use -o no OpenCL e devolva os resultados. Eu quero ver se isso é possível. Eu tive dificuldade em fazer um projeto CUDA funcionar, então eu apenas usei o projeto de modelo da Nvidia em seu SDK. No Makefile, adicionei -lopencl à seção Libs do Common.mk. Tudo está bem quando faço isso, mas quando eu adiciono #include <CL/cl.h>
Para modelar.cu para que eu possa começar a fazer chamadas de OpenCL, recebo mais de 100 erros. Todos eles se parecem com isso, mas com nomes de funções diferentes no final:
/usr/lib/gcc/x86_64-linux-gnu/4.4.1/include/xmmintrin.h(334): erro: identificador "__builtin_ia32_cmpeqps" é indefinido
Estou tendo dificuldade em descobrir o porquê. Por favor, ajude se você puder. Além disso, se houver uma maneira mais fácil de configurar um projeto que possa chamar as APIs CUDA e OpenCL, me avise.
Solução
Eu realmente não trabalhei com Cuda, então não sei o quão útil minha resposta é.
Pelo que eu entendo, você está tentando usar o OpenCL diretamente do seu CUDA Hostcode, que é se bem me lembro compilado usando algum compilador da NVIDIA em vez do GCC padrão. Portanto, o problema é provavelmente que esse compilador não implementa os Buildins necessários para trabalhar com os cabeçalhos mencionados. Procure aqui um problema semelhante e sua solução:http://forums.nvidia.com/lofiversion/index.php?t88573.html
Parece que você precisa colocar tudo o que precisa da API OpenCL em uma unidade de compilação diferente (não CUDA) para que seja compilada pelo compilador não NVIDIA.
No entanto, eu não contaria com esse trabalho (já que os buffers de OpenCL não são apenas ponteiros para a memória, mas devem conter algumas formas de metade), simplesmente porque não há razão real para funcionar e, se não há garantia de que ele continue fazer isso.
O que você poderia tentar se realmente quiser é usar o OpenGL para a interoper, já que o OpenCL e o CUDA têm extensões para permitir a criação de buffers a partir de buffers OpenGL.
No entanto, por que você precisa fazer isso? O que o impede de usar a implementação da Apple a curto prazo, já que o IIRC é de código aberto e a maior parte (as peças do OpenCL) deve ser independente da plataforma.