我有这个职位上完全相同的问题:
OpenCL简单的“Hello World!” 程序编译正确,但执行时吐出垃圾
但我实际上已经安装了NvIDia驱动程序。
我想得到这个程序的工作: http : //www.fixstars.com/en/opencl/book/OpenCLProgrammingBook/first-opencl-program/
Winsock – 从C ++中的Java客户端读取整数
我可以为所有linux编译器使用一个linux .so吗?
检测文件是否被覆盖(移动和replace)使用C#
当有多个login时,检测多个应用程序实例的更改
如何在打开的pipe理员程序中调用system()并赋予它相同的权限?
所以我得到了来自https://www.khronos.org/的头文件
我编译它是这样的:
gcc -I / usr / include / hello.c -L / usr / lib64 -lOpenCL
这是输出:
hello.c:在函数'main'中:
hello.c:56:1:警告:不推荐使用“clCreateCommandQueue”(在/usr/include/CL/cl.h:1359声明)[-Wdeprecated-declarations]
hello.c:75:1:警告:不推荐使用“clEnqueueTask”(在/usr/include/CL/cl.h:1373声明)[-Wdeprecated-declarations]
如果我运行程序,我会得到:
–
这是我的设置:
OpenSuse 12.3
通过yast安装的NvIDia驱动程序:
nvIDia-computeG03 340.65-32.1
glxinfo |的输出 grep -i供应商:
服务器glx供应商string:NVIDIA公司客户端glx供应商string:NVIDIA公司OpenGL供应商string:NVIDIA公司
输出lspci -nnk | grep -i vga -A3
03:00.0 VGA兼容控制器:NVIDIA公司GF119 [Quadro NVS 310] [10de:107d](rev a1)
子系统:NVIDIA公司设备[10de:094e]
正在使用的内核驱动程序:nvIDia
03:00.1audio设备[0403]:NVIDIA公司GF119 HDMIaudio控制器[10de:0e08](rev a1)
也许openCL不使用的NVIDIA驱动程序,但我不知道如何检查这一点。 我希望有一个人可以帮助我。
谢谢。
编辑12.02.15 17:08
非常感谢jprice,
我用你的function来绘制错误信息。 我的代码如下所示:
/* Get Platform and Device Info */ ret = clGetPlatformIDs(1,&platform_ID,&ret_num_platforms); checkerror(ret,"clGetPlatformIDs");
我得到这个输出:
运行期间出错'clGetPlatformIDs':-1001
按照build议查看CL.h后,似乎没有find任何设备。
从cl.h:
#define CL_DEVICE_NOT_FOUND -1
正如我已经发布,我在我的系统中有一个Quadro NVS 310在列表中的兼容设备。 你有什么想法是什么问题?
这是我编译的竞争代码:
#include <stdio.h> #include <stdlib.h> #ifdef __APPLE__ #include <OpenCL/opencl.h> #else #include <CL/cl.h> #endif #define MEM_SIZE (128) #define MAX_SOURCE_SIZE (0x100000) voID checkerror(cl_int err,const char *operation) { if (err != CL_SUCCESS) { fprintf(stderr,"Error during operation '%s': %dn",operation,err); exit(1); } } int main() { cl_device_ID device_ID = NulL; cl_context context = NulL; cl_command_queue command_queue = NulL; cl_mem memobj = NulL; cl_program program = NulL; cl_kernel kernel = NulL; cl_platform_ID platform_ID = NulL; cl_uint ret_num_devices; cl_uint ret_num_platforms; cl_int ret; char string[MEM_SIZE]; char test_string[20]; /*strcpy(test_string,"ENDE");*/ file *fp; char filename[] = "./hello.cl"; char *source_str; size_t source_size; /* Load the source code containing the kernel*/ fp = fopen(filename,"r"); if (!fp) { fprintf(stderr,"Failed to load kernel.n"); exit(1); } source_str = (char*)malloc(MAX_SOURCE_SIZE); source_size = fread(source_str,1,MAX_SOURCE_SIZE,fp); fclose(fp); /* Get Platform and Device Info */ ret = clGetPlatformIDs(1,"clGetPlatformIDs"); ret = clGetdeviceids(platform_ID,CL_DEVICE_TYPE_DEFAulT,&device_ID,&ret_num_devices); checkerror(ret,"clGetdeviceids"); /* Create OpenCL context */ context = clCreateContext(NulL,NulL,&ret); checkerror(ret,"clCreateContext"); /* Create Command Queue */ command_queue = clCreateCommandQueue(context,device_ID,"clCreateCommandQueue"); /* Create Memory Buffer */ memobj = clCreateBuffer(context,CL_MEM_READ_WRITE,MEM_SIZE * sizeof(char),"clCreateBuffer"); /* Create Kernel Program from the source */ program = clCreateProgramWithSource(context,(const char **)&source_str,(const size_t *)&source_size,"clCreateProgramWithSource"); /* Build Kernel Program */ ret = clBuildProgram(program,NulL); checkerror(ret,"clBuildProgram"); /* Create OpenCL Kernel */ kernel = clCreateKernel(program,"hello","clCreateKernel"); /* Set OpenCL Kernel Parameters */ ret = clSetKernelArg(kernel,sizeof(cl_mem),(voID *)&memobj); checkerror(ret,"clSetKernelArg"); /* Execute OpenCL Kernel */ ret = clEnqueueTask(command_queue,kernel,"clEnqueueTask"); /* copy results from the memory buffer */ ret = clEnqueueReadBuffer(command_queue,memobj,CL_TRUE,string,NulL); /* display Result */ puts(string); /* Finalization */ ret = clFlush(command_queue); ret = clFinish(command_queue); ret = clReleaseKernel(kernel); ret = clReleaseProgram(program); ret = clReleaseMemObject(memobj); ret = clReleaseCommandQueue(command_queue); ret = clReleaseContext(context); free(source_str); return 0; }´
更新13.02.15感谢您的build议。
我检查了/etc/OpenCL/vendors/nvIDia.icd是否存在。 它的确如此:
libnvIDia-opencl.so.1
图书馆存在于
/usr/lib64/libnvIDia-opencl.so.1
我不明白的是,我可以编译代码和库lopencl被find。 我通过yast安装驱动程序,并手动将头文件手动复制到usr / include。 我还没有安装cuda软件包,因为我只是想使用opencl。 这可能是问题吗?
谢谢
获取图像的来源,当用户点击它在C#
使用IsolatedStorageSettings为wp8中的应用永久存储信息
fscanf()返回负值
如何在Process Explorer中获得进程开始地址的“名称”?
获取包含hex值的LPTSTR或CHAR *的大小
您正在使用的示例代码无法检查所有OpenCL API调用返回的错误代码。 一个或多个这些功能可能失败,但是您的代码只是忽略了失败并试图继续。
我通常在这样的效用函数中包装OpenCL错误检查:
voID checkerror(cl_int err,err); exit(1); } }
然后你可以添加错误检查到你的代码是这样的:
/* Create OpenCL context */ context = clCreateContext(NulL,"creating context"); /* Create Command Queue */ command_queue = clCreateCommandQueue(context,"creating command queue"); /* Create Memory Buffer */ memobj = clCreateBuffer(context,"creating buffer"); /* Create coreel Program from the source */ program = clCreateProgramWithSource(context,"creating program"); /* Build coreel Program */ ret = clBuildProgram(program,"building program"); // etc
现在,当OpenCL API调用失败时,您的程序将打印出哪个函数失败以及错误代码是什么。 您可以在CL/cl.h头文件中查找错误代码的人类可读名称,并阅读OpenCL规范以找出导致该错误的原因。 您也可以在checkerror函数中创建一个查找表来自动检索人类可读的名称。
总结以上是内存溢出为你收集整理的OpenCL简单的“Hello World!”程序编译正确,但执行时会吐出垃圾。 但是,Nvidia驱动程序已安装全部内容,希望文章能够帮你解决OpenCL简单的“Hello World!”程序编译正确,但执行时会吐出垃圾。 但是,Nvidia驱动程序已安装所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)