我已经搜索了高低的答案,所以我很抱歉,如果这是一件微不足道的事情,我无法自行解决。
我刚刚获得了具有双780i gpus的新Alienware极光,我将用于CT图像重建。我打算在OpenCL工作,因为这是我已经知道的。到目前为止,我只使用Mac并使用OpenCL框架编译代码非常简单。现在,在Windows 8.1中,事情就不那么重要了。
我已经安装了NVidia Cuda SDK,它附带了所有OpenCL头文件和库(都安装在标准位置),并开始尝试使用MinGW配置Code ::块来编译和链接OpenCL库。我总是得到同样的错误(向下滚动以查看它)。我之前已经链接了库,所以我99%我已经在那里正确配置了东西,但显然我错过了一些东西。要查看我做了什么,请转到http://www.obellianne.fr/alexandre/tutorials/OpenCL/tuto_opencl_codeblocks.php。
我已经转移到命令行,这样我就可以更全面地配置,但即使我仔细配置,我也会遇到同样的错误。
我在DOS提示符下一直使用的调用如下:
gcc -v -Wall -std=c99 -I "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\include" -L "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\lib\x64" main.c -lOpenCL
我的输出是这样的:
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0x5f): undefined reference to `clGetPlatformIDs@12'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0xb5): undefined reference to `clGetDeviceIDs@24'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0xf3): undefined reference to `clGetDeviceIDs@24'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0x141): undefined reference to `clGetDeviceInfo@20'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0x18f): undefined reference to `clGetDeviceInfo@20'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0x1bf): undefined reference to `clGetDeviceInfo@20'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\john\AppData\Local\Temp\ccGTa4TT.o: bad reloc address 0x20 in section `.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
(我已经剔除了一些东西,但如果需要可以更新更详细的信息)
奇怪的是,经过多次摆弄后,链接器正在链接库(嗯,不是,但至少找到了库并尝试链接它)。
我知道当-lOpenCL在错误的地方时会遇到这些问题,所以我尝试将它放在我能想到的任何地方都没有成功。它总是会抛出相同的错误。
我的程序的源代码可以在最底层找到。它是从书籍示例中剪切和粘贴的,我已经在我的mac上成功编译了它。
有什么想法吗?
谢谢, 约翰
#include <stdio.h>
#include <stdlib.h>
#include <CL/cl.h>
int main()
{
/* Host/device data structures */
cl_platform_id platform;
cl_device_id dev;
cl_uint addr_data;
cl_int err;
/* Extension data */
char name_data[48], ext_data[4096];
/* Identify a platform */
err = clGetPlatformIDs(1, &platform, NULL);
if(err < 0) {
perror("Couldn't find any platforms");
exit(1);
}
/* Access a device, preferably a GPU */
/* Changed on 2/12 to fix the CL_INVALID_VALUE error */
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &dev, NULL);
if(err == CL_DEVICE_NOT_FOUND) {
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &dev, NULL);
}
if(err < 0) {
perror("Couldn't access any devices");
exit(1);
}
/* Access device name */
err = clGetDeviceInfo(dev, CL_DEVICE_NAME,
48 * sizeof(char), name_data, NULL);
if(err < 0) {
perror("Couldn't read extension data");
exit(1);
}
/* Access device address size */
clGetDeviceInfo(dev, CL_DEVICE_ADDRESS_BITS,
sizeof(addr_data), &addr_data, NULL);
/* Access device extensions */
clGetDeviceInfo(dev, CL_DEVICE_EXTENSIONS,
4096 * sizeof(char), ext_data, NULL);
printf("NAME: %s\nADDRESS_WIDTH: %u\nEXTENSIONS: %s\n",
name_data, addr_data, ext_data);
return 0;
}
答案 0 :(得分:1)
答案 1 :(得分:0)
如果你需要更多内存,可以编译和编译x64的MinGW风格。对于像Qt
这样的项目,可能是必要的。他们推荐了一些你可以在这里阅读的内容:
http://qt-project.org/wiki/MinGW-64-bit
我已使用ReubenVB
在Qt
中使用x64
库编译OpenCL
,但这大约是在1年前。