gpt4 book ai didi

c - OpenCL Simple “Hello World!” 程序编译正确但在执行时吐出垃圾。但是安装了 Nvidia 驱动程序

转载 作者:太空狗 更新时间:2023-10-29 12:15:02 28 4
gpt4 key购买 nike

我遇到了与这篇文章完全相同的问题:

OpenCL Simple "Hello World!" program compiles correctly but spits out garbage when executed

但我实际上已经安装了 Nvidia 驱动程序。

我想让这个程序运行: http://www.fixstars.com/en/opencl/book/OpenCLProgrammingBook/first-opencl-program/

所以我从以下位置获得了头文件:https://www.khronos.org/

我是这样编译的:

gcc -I /usr/include/ hello.c -L/usr/lib64 -lOpenCL

这是输出:

hello.c: In function ‘main’:

hello.c:56:1: warning: ‘clCreateCommandQueue’ is deprecated (declared at /usr/include/CL/cl.h:1359) [-Wdeprecated-declarations]

hello.c:75:1: warning: ‘clEnqueueTask’ is deprecated (declared at /usr/include/CL/cl.h:1373) [-Wdeprecated-declarations]

如果我运行程序,我会得到:

���-�

这是我的设置:

OpenSuse 12.3

通过 yast 安装的 Nvidia 驱动程序:

nvidia-computeG03 340.65-32.1

glxinfo 的输出 | grep -i 供应商:

服务器 glx 供应商字符串:NVIDIA Corporation客户端 glx 供应商字符串:NVIDIA CorporationOpenGL 供应商字符串:NVIDIA Corporation

lspci -nnk 的输出 | grep -i vga -A3

03:00.0 VGA compatible controller [0300]: NVIDIA Corporation GF119 [Quadro NVS 310] [10de:107d] (rev a1)

Subsystem: NVIDIA Corporation Device [10de:094e]

Kernel driver in use: nvidia

03:00.1 Audio device [0403]: NVIDIA Corporation GF119 HDMI Audio Controller [10de:0e08] (rev a1)

也许 openCL 没有使用 nvidia 驱动程序,但我不知道如何检查。我希望有人能帮助我。

谢谢。


编辑 12.02.15 17:08

非常感谢jprice,

我用你的函数绘制了错误消息。我的代码如下所示:

/* 获取平台和设备信息 */
ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
checkError(ret, "clGetPlatformIDs");

我得到这个输出:

操作“clGetPlatformIDs”时出错:-1001

按照建议查看 CL.h 后,似乎没有找到任何设备。

来自 cl.h:

#define CL_DEVICE_NOT_FOUND -1

正如我已经发布的那样,我的系统中有一个 Quadro NVS 310,它在 cl 兼容设备的列表中。您知道出了什么问题吗?

这是我编译的竞争代码:

#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': %d\n", 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, &platform_id, &ret_num_platforms);
checkError(ret, "clGetPlatformIDs");

ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, &ret_num_devices);
checkError(ret, "clGetDeviceIDs");

/* Create OpenCL context */
context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
checkError(ret, "clCreateContext");

/* Create Command Queue */
command_queue = clCreateCommandQueue(context, device_id, 0, &ret);
checkError(ret, "clCreateCommandQueue");

/* Create Memory Buffer */
memobj = clCreateBuffer(context, CL_MEM_READ_WRITE,MEM_SIZE * sizeof(char), NULL, &ret);
checkError(ret, "clCreateBuffer");

/* Create Kernel Program from the source */
program = clCreateProgramWithSource(context, 1, (const char **)&source_str,
(const size_t *)&source_size, &ret);
checkError(ret, "clCreateProgramWithSource");

/* Build Kernel Program */
ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
checkError(ret, "clBuildProgram");

/* Create OpenCL Kernel */
kernel = clCreateKernel(program, "hello", &ret);
checkError(ret, "clCreateKernel");

/* Set OpenCL Kernel Parameters */
ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobj);
checkError(ret, "clSetKernelArg");

/* Execute OpenCL Kernel */
ret = clEnqueueTask(command_queue, kernel, 0, NULL,NULL);
checkError(ret, "clEnqueueTask");

/* Copy results from the memory buffer */
ret = clEnqueueReadBuffer(command_queue, memobj, CL_TRUE, 0,
MEM_SIZE * sizeof(char),string, 0, NULL, 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谢谢你的建议。

我检查了/etc/OpenCL/vendors/nvidia.icd 是否存在。它确实如此,看起来像这样:

libnvidia-opencl.so.1

库存在于

/usr/lib64/libnvidia-opencl.so.1

我不明白的是,我可以编译代码和库 lopencl被发现。我通过 yast 安装了驱动程序,并单独将头文件手动复制到 usr/include。我还没有安装cuda包,因为我只想使用opencl。这可能是问题所在吗?

谢谢

最佳答案

您使用的示例代码无法检查所有 OpenCL API 调用返回的错误代码。这些功能中的一个或多个可能会失败,但您的代码只是忽略失败并尝试继续。

我通常在这样的实用函数中结束 OpenCL 错误检查:

void checkError(cl_int err, const char *operation)
{
if (err != CL_SUCCESS)
{
fprintf(stderr, "Error during operation '%s': %d\n", operation, err);
exit(1);
}
}

然后你可以像这样给你的代码添加错误检查:

/* Create OpenCL context */
context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
checkError(ret, "creating context");

/* Create Command Queue */
command_queue = clCreateCommandQueue(context, device_id, 0, &ret);
checkError(ret, "creating command queue");

/* Create Memory Buffer */
memobj = clCreateBuffer(context, CL_MEM_READ_WRITE,MEM_SIZE * sizeof(char), NULL, &ret);
checkError(ret, "creating buffer");

/* Create Kernel Program from the source */
program = clCreateProgramWithSource(context, 1, (const char **)&source_str,
(const size_t *)&source_size, &ret);
checkError(ret, "creating program");

/* Build Kernel Program */
ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
checkError(ret, "building program");

// etc

现在,当 OpenCL API 调用失败时,您的程序将打印出哪个函数失败以及错误代码是什么。您可以在 CL/cl.h header 中查找错误代码的人类可读名称,并阅读 OpenCL 规范以找出导致该错误的原因。您还可以在 checkError 函数中创建一个查找表,以自动检索人类可读的名称。

关于c - OpenCL Simple “Hello World!” 程序编译正确但在执行时吐出垃圾。但是安装了 Nvidia 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28477660/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com