gpt4 book ai didi

c - OpenCL 无法为常量数组设置内核参数

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:50 31 4
gpt4 key购买 nike

我正在尝试设置我的内核的参数,当我尝试设置 arg-0 这是边界时,我不断收到 CL_INVALID_ARG_SIZE。奇怪的是,如果我只注释掉第一个 clSetKernelArgs,所有其他似乎都有效。我认为这可能是常量数组的问题,除了它适用于 rand_seeds。

success = clSetKernelArg(solver_kernel, 0, sizeof(cl_float) * 10, bounds);
if(success != CL_SUCCESS)
{
printf("%d\n", success);
exit(1);
}
success = clSetKernelArg(solver_kernel, 1, sizeof(cl_float) * 2, seeds);
if(success != CL_SUCCESS)
{
printf("%d\n", success);
exit(1);
}
success = clSetKernelArg(solver_kernel, 2, sizeof(cl_int), &trials);
if(success != CL_SUCCESS)
{
printf("%d\n", success);
exit(1);
}
success = clSetKernelArg(solver_kernel, 3, sizeof(cl_int), &start_temp);
if(success != CL_SUCCESS)
{
printf("%d\n", success);
exit(1);
}

这是我的内核头文件

  __kernel void solver_kernel
(
__constant float bounds[10],
__constant int rand_seeds[2],
int trials,
int start_temp
)

最佳答案

来自OpenCL specification :

The memory object specified as argument value must be a buffer object (or NULL) if the argument is declared to be a pointer of a built-in or user defined type with the __global or __constant qualifier.

所以你必须先创建一个缓冲区并将其设置为你的内核参数。应该是这样的

cl_mem bounds_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_float) * 10, bounds, &success); 
success = clSetKernelArg(solver_kernel, 0, sizeof(cl_mem), bounds_buffer);

你需要为 rand_seeds 参数做同样的事情,即使你在这一行没有得到错误(可能是因为 sizeof(cl_float) * 2 == sizeof(cl_mem) 偶然,这仍然会产生不正确的结果)。

关于c - OpenCL 无法为常量数组设置内核参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35827106/

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