OpenCL简单的“Hello World!”程序编译正确,但执行时会吐出垃圾。但是,Nvidia驱动程序已安装

OpenCL简单的“Hello World!”程序编译正确,但执行时会吐出垃圾。但是,Nvidia驱动程序已安装,第1张

概述OpenCL简单的“Hello World!”程序编译正确,但执行时会吐出垃圾。 但是,Nvidia驱动程序已安装

我有这个职位上完全相同的问题:

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驱动程序已安装所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1157875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存