Concurrency 提供指针会导致我的OpenCL代码不正确

Concurrency 提供指针会导致我的OpenCL代码不正确,concurrency,parallel-processing,opencl,Concurrency,Parallel Processing,Opencl,我的电脑有GeForce 1080Ti。对于11GB的VRAM,我不希望出现内存问题,所以我无法解释为什么下面的代码会中断 我用这段代码在主机上执行内核 cl_mem buffer = clCreateBuffer(context.GetContext(), CL_MEM_READ_WRITE, n * n * sizeof(int), NULL, &error); error = clSetKernelArg(context.GetKernel(myKernel), 1, n * n,

我的电脑有GeForce 1080Ti。对于11GB的VRAM,我不希望出现内存问题,所以我无法解释为什么下面的代码会中断

我用这段代码在主机上执行内核

cl_mem buffer = clCreateBuffer(context.GetContext(), CL_MEM_READ_WRITE, n * n * sizeof(int), NULL, &error);
error = clSetKernelArg(context.GetKernel(myKernel), 1, n * n, m1);

error = clSetKernelArg(context.GetKernel(myKernel), 0, sizeof(cl_mem), &buffer);

error = clEnqueueNDRangeKernel(context.GetCommandQueue(0), context.GetKernel(myKernel), 1, NULL, 10, 10, 0, NULL, NULL);

clFinish(context.GetCommandQueue(0));

error = clEnqueueReadBuffer(context.GetCommandQueue(0), buffer, true, 0, n * n * sizeof(int), results, 0, NULL, NULL);
results
是指向n×n
int
数组的指针。m1是指向n×n位数组的指针。变量n可以被8整除,因此我们可以将数组解释为
char
数组

内核将数组的前十个值设置为1025(该值不重要):

当我在主机上打印结果时,前10个索引是1025。一切都很好

当我引入另一个论点时,它突然停止工作:

__kernel void PopCountProduct  (__global int *results, __global char *m)
{
    results[get_global_id(0)] = 1025;
}

为什么会这样?我是否遗漏了OpenCL的一些关键内容?

在OpenCL 1.2中,您不能使用指向
clSetKernelArg
的主机指针。类似的事情只能在OpenCL2.0+中通过
clSetKernelArgSVMPointer
和支持向量机指针来完成。但最有可能的是,在GPU上创建一个缓冲区对象,并将主机内存复制到它,这就是您所需要的

__kernel void PopCountProduct  (__global int *results, __global char *m)
{
    results[get_global_id(0)] = 1025;
}