Я использую Nvidia GPU Computing toolkit в Windows 7 x64 с 64-битным пакетом Cygwin и Eclipse. (Я использую внутренние инструменты сборки, потому что GNU make не любит двоеточия в путях Windows.) Мой код:
Здесь довольно простой фрагмент кода: #include #include с использованием пространства имен std;
int main() {
cl_int error = 42;
cl_platform_id platform;
error = clGetPlatformIDs(1, &platform, NULL);
return 0;
}
C++ код компилируется и работает нормально, и я могу использовать заголовки OpenCL и cl_int
и cl_device_id
, но с clGetPlatformID
я получаю следующую ошибку компиляции:
relocation truncated to fit: R_X86_64_32 against symbol
'__imp_clGetPlatformIDs' defined in .idata$5 section in
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\lib
\x64/OpenCL.lib(OpenCL.dll.b)
Я пробовал следующее:
Я предполагаю, что внутренний строитель виноват, но использование этого было решением другой проблемы, которая привела к сбою сборки.
У меня была такая же ошибка, наконец я решил эту проблему, и последнее, что я сделал, это:
1) В cygwin установите все пакеты, содержащие opencl
в имени.
2) Далее, в ...\cygwin\etc\OpenCL\vendors\
vendors ...\cygwin\etc\OpenCL\vendors\
(я нашел pocl.icd там) создаю nvidia.icd
и разместил там одну строку "/cygdrive/c/Windows/System32/nvopencl.dll". Аналогичные действия могут быть выполнены для драйвера Intel OpenCL.
3) Наконец, не делайте ошибок (как и я) в файле CMake. Пример рабочего кода:
cmake_minimum_required(VERSION 3.6)
set(MODULE_NAME opencl-test)
project(${MODULE_NAME})
set(CMAKE_CXX_STANDARD 14)
find_package(OpenCL)
# set include directories
include_directories(${OpenCL_INCLUDE_DIRS})
# set source files
set(SOURCE_FILES main.cpp)
add_executable(${MODULE_NAME} ${SOURCE_FILES})
# linking
target_link_libraries(${MODULE_NAME} ${OpenCL_LIBRARY})
У меня есть небольшое обновление об этом:
Протерте и переустановите почти все (инструментарий CUDA, Cygwin, Eclipse), и он по-прежнему дает мне ту же ошибку даже с соответствующими флагами (которые я использовал до того, как капитан Очевидный был связан с сообщением, предлагающим его).
Прогресс, который я сделал, заключается в том, что я, вероятно, обрушился на то, где проблема на самом деле. Исходя из относительных путей, проблемы с GNU не могут справиться с двоеточиями в путях. Это в основном очищает внутренний конструктор Eclipse. Тем не менее, у меня почти такая же настройка, что и на другой машине, разница в том, что эта настройка имеет карту AMD и, следовательно, использует пакет приложений AMD App SDK, а не Nvidia OpenCL.
Мое подозрение состоит в том, что это может быть ошибкой, вызванной недавно выпущенной версией 6.0 инструментария CUDA, поскольку она вводит некоторые довольно крупные обновления, такие как унифицированная память, и они, возможно, не тестировали ее так хорошо, без плагина NSight Visual Studio. В конце концов, они рекомендуют вам разрабатывать Visual Studio с этим плагином, и у меня нет (законного) доступа к Visual Studio прямо сейчас.
Редактирование: я довольно хорошо это подтвердил... Установил SDK для приложений AMD на машине Nvidia GPU, и он работает безупречно, так что, похоже, Nvidia действительно испортила OpenCL в версии 6 CUDA Toolkit. Ты знаешь, что они в конкуренции с OpenCL через CUDA, вряд ли найду это удивительным.