clSetKernelArg返回错误代码-49 我写了以下C++代码。在clSetKernelArg(kernel,8,sizeof(cl_mem),(void*)和mob_whdis),它返回错误代码-49,我不明白为什么。其他一切运行正常。有人能帮我吗 cl_mem mob_X = NULL; cl_mem mob_Y = NULL; cl_mem mob_Z = NULL; cl_mem mob_WAT = NULL; cl_mem mob_POL = NULL; cl_mem mob_FSW = NULL; cl_mem mob_nop = NULL; cl_mem mob_nofsw = NULL; cl_mem mob_whdis = NULL; cl_mem mob_watwp = NULL; cl_mem mob_watp = NULL; cl_mem mob_distp = NULL; cl_mem mob_watww = NULL; cl_mem mob_watw = NULL; cl_mem mob_distw = NULL; cl_program program = NULL; cl_kernel kernel = NULL; cl_uint ret_num_devices; cl_uint ret_num_platforms; cl_int err; float whdis=3.5; mob_X = clCreateBuffer( context, CL_MEM_READ_WRITE, na * sizeof(float), NULL, &err ); mob_Y = clCreateBuffer( context, CL_MEM_READ_WRITE, na * sizeof(float), NULL, &err ); mob_Z = clCreateBuffer( context, CL_MEM_READ_WRITE, na * sizeof(float), NULL, &err ); mob_WAT = clCreateBuffer( context, CL_MEM_READ_WRITE, now * sizeof(int), NULL, &err ); mob_POL = clCreateBuffer( context, CL_MEM_READ_WRITE, nop * sizeof(int), NULL, &err ); mob_FSW = clCreateBuffer( context, CL_MEM_READ_WRITE, now * sizeof(int), NULL, &err ); mob_nop = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int), NULL, &err ); mob_nofsw = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int), NULL, &err ); mob_whdis = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float), NULL, &err ); mob_watwp = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int) * now * 40, NULL, &err ); mob_watp = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int) * now * 40, NULL, &err ); mob_distp = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float) * now * 40, NULL, &err ); mob_watww = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int) * now * 40, NULL, &err ); mob_watw = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int) * now * 40, NULL, &err ); mob_distw = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float) * now * 40, NULL, &err ); err = clEnqueueWriteBuffer( command_queue, mob_X, CL_TRUE, 0, na * sizeof(float), X, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_Y, CL_TRUE, 0, na * sizeof(float), Y, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_Z, CL_TRUE, 0, na * sizeof(float), Z, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_WAT, CL_TRUE, 0, now * sizeof(int), wat, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_POL, CL_TRUE, 0, nop * sizeof(int), pol, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_FSW, CL_TRUE, 0, now * sizeof(int), fsw, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_nop, CL_TRUE, 0, sizeof(int), &nop, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_nofsw, CL_TRUE, 0, sizeof(int), &nofsw, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_whdis, CL_TRUE, 0, sizeof(float), &whdis, 0, NULL, NULL ); err_check( err, "clSetKernelArg" ); err = clSetKernelArg( kernel, 0, sizeof( cl_mem ), (void *) &mob_X ); err = clSetKernelArg( kernel, 1, sizeof( cl_mem ), (void *) &mob_Y ); err = clSetKernelArg( kernel, 2, sizeof( cl_mem ), (void *) &mob_Z ); err = clSetKernelArg( kernel, 3, sizeof( cl_mem ), (void *) &mob_WAT ); err = clSetKernelArg( kernel, 4, sizeof( cl_mem ), (void *) &mob_POL ); err = clSetKernelArg( kernel, 5, sizeof( cl_mem ), (void *) &mob_FSW ); err = clSetKernelArg( kernel, 6, sizeof( cl_mem ), (void *) &mob_nop ); err = clSetKernelArg( kernel, 7, sizeof( cl_mem ), (void *) &mob_nofsw ); err = clSetKernelArg( kernel, 8, sizeof( cl_mem ), (void *) &mob_whdis ); // Step 11: Execute OpenCL kernel in data parallel size_t worksize[] = { now, 1, 1 }; clEnqueueNDRangeKernel( command_queue, kernel, 1, NULL, worksize, 0, 0, 0, 0 ); err_check( err, "clEnqueueNDRangeKernel" ); // Step 12: Read (Transfer result) from the memory buffer

clSetKernelArg返回错误代码-49 我写了以下C++代码。在clSetKernelArg(kernel,8,sizeof(cl_mem),(void*)和mob_whdis),它返回错误代码-49,我不明白为什么。其他一切运行正常。有人能帮我吗 cl_mem mob_X = NULL; cl_mem mob_Y = NULL; cl_mem mob_Z = NULL; cl_mem mob_WAT = NULL; cl_mem mob_POL = NULL; cl_mem mob_FSW = NULL; cl_mem mob_nop = NULL; cl_mem mob_nofsw = NULL; cl_mem mob_whdis = NULL; cl_mem mob_watwp = NULL; cl_mem mob_watp = NULL; cl_mem mob_distp = NULL; cl_mem mob_watww = NULL; cl_mem mob_watw = NULL; cl_mem mob_distw = NULL; cl_program program = NULL; cl_kernel kernel = NULL; cl_uint ret_num_devices; cl_uint ret_num_platforms; cl_int err; float whdis=3.5; mob_X = clCreateBuffer( context, CL_MEM_READ_WRITE, na * sizeof(float), NULL, &err ); mob_Y = clCreateBuffer( context, CL_MEM_READ_WRITE, na * sizeof(float), NULL, &err ); mob_Z = clCreateBuffer( context, CL_MEM_READ_WRITE, na * sizeof(float), NULL, &err ); mob_WAT = clCreateBuffer( context, CL_MEM_READ_WRITE, now * sizeof(int), NULL, &err ); mob_POL = clCreateBuffer( context, CL_MEM_READ_WRITE, nop * sizeof(int), NULL, &err ); mob_FSW = clCreateBuffer( context, CL_MEM_READ_WRITE, now * sizeof(int), NULL, &err ); mob_nop = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int), NULL, &err ); mob_nofsw = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int), NULL, &err ); mob_whdis = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float), NULL, &err ); mob_watwp = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int) * now * 40, NULL, &err ); mob_watp = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int) * now * 40, NULL, &err ); mob_distp = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float) * now * 40, NULL, &err ); mob_watww = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int) * now * 40, NULL, &err ); mob_watw = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(int) * now * 40, NULL, &err ); mob_distw = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float) * now * 40, NULL, &err ); err = clEnqueueWriteBuffer( command_queue, mob_X, CL_TRUE, 0, na * sizeof(float), X, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_Y, CL_TRUE, 0, na * sizeof(float), Y, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_Z, CL_TRUE, 0, na * sizeof(float), Z, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_WAT, CL_TRUE, 0, now * sizeof(int), wat, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_POL, CL_TRUE, 0, nop * sizeof(int), pol, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_FSW, CL_TRUE, 0, now * sizeof(int), fsw, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_nop, CL_TRUE, 0, sizeof(int), &nop, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_nofsw, CL_TRUE, 0, sizeof(int), &nofsw, 0, NULL, NULL ); err = clEnqueueWriteBuffer( command_queue, mob_whdis, CL_TRUE, 0, sizeof(float), &whdis, 0, NULL, NULL ); err_check( err, "clSetKernelArg" ); err = clSetKernelArg( kernel, 0, sizeof( cl_mem ), (void *) &mob_X ); err = clSetKernelArg( kernel, 1, sizeof( cl_mem ), (void *) &mob_Y ); err = clSetKernelArg( kernel, 2, sizeof( cl_mem ), (void *) &mob_Z ); err = clSetKernelArg( kernel, 3, sizeof( cl_mem ), (void *) &mob_WAT ); err = clSetKernelArg( kernel, 4, sizeof( cl_mem ), (void *) &mob_POL ); err = clSetKernelArg( kernel, 5, sizeof( cl_mem ), (void *) &mob_FSW ); err = clSetKernelArg( kernel, 6, sizeof( cl_mem ), (void *) &mob_nop ); err = clSetKernelArg( kernel, 7, sizeof( cl_mem ), (void *) &mob_nofsw ); err = clSetKernelArg( kernel, 8, sizeof( cl_mem ), (void *) &mob_whdis ); // Step 11: Execute OpenCL kernel in data parallel size_t worksize[] = { now, 1, 1 }; clEnqueueNDRangeKernel( command_queue, kernel, 1, NULL, worksize, 0, 0, 0, 0 ); err_check( err, "clEnqueueNDRangeKernel" ); // Step 12: Read (Transfer result) from the memory buffer,opencl,pyopencl,Opencl,Pyopencl,错误-49是CL\u无效\u ARG\u索引。您应该检查opencl内核源代码参数 此外,在您的代码中,您应该使用程序的OpenCL源代码clCreateProgramWithSource,clBuildProgram编译并链接它,然后使用clCreateKernel获取有效的内核引用。然后您可以正确地使用clSetKernelArg。只是一个快速回答问题: mob_whdis是一个大小为sizeof(float)的设备缓冲区。这意味着全局内存中只有一个浮点值。全局内存在读写时有很大的性能损失。

错误-49是
CL\u无效\u ARG\u索引
。您应该检查opencl内核源代码参数


此外,在您的代码中,您应该使用程序的OpenCL源代码
clCreateProgramWithSource
clBuildProgram
编译并链接它,然后使用
clCreateKernel
获取有效的内核引用。然后您可以正确地使用
clSetKernelArg

只是一个快速回答问题:

mob_whdis是一个大小为sizeof(float)的设备缓冲区。这意味着全局内存中只有一个浮点值。全局内存在读写时有很大的性能损失。您是否可以改为使用私有常量,例如:

浮球移动速度=0.0f; ... SetKernalArg(kernel,8,sizeof(float)和mob_whdis)

这会在私有内存中的所有内核中放置一个浮点常量,这非常快,比全局内存快得多


mob_nofsw和mob_nop也是如此。

我冒昧地改写了你的问题。我希望没问题。:)这将是一个开始。