更改OpenCL内核中数组的大小

更改OpenCL内核中数组的大小,opencl,Opencl,我希望有人能帮我 我需要使用如下方式将表示矩阵的长数组传递给opencl内核: memObjects[2] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(double) * dets_numel, dets, NULL); 在内核中,我希望根据某些条件删除矩阵中的一些行,然后使用如下方式将其读回主机: errNum = clEnq

我希望有人能帮我

我需要使用如下方式将表示矩阵的长数组传递给opencl内核:

memObjects[2] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
                               sizeof(double) * dets_numel, dets, NULL);
在内核中,我希望根据某些条件删除矩阵中的一些行,然后使用如下方式将其读回主机:

errNum = clEnqueueReadBuffer(commandQueue, memObjects[2], CL_TRUE, 0,
                             dims1[0] * dims1[1] * sizeof(double), dets,
                             0, NULL, NULL);

有没有一种方法可以让程序的主机部分知道数组(矩阵)的确切大小,而无需执行另一个内核来计算大小并将结果从缓冲区读回主机?

可能有一种专门针对您的问题的解决方法,但通常-没有。您可以隐式地找到新的大小,或者读回显式值

我认为您无法更改存储设备内存的大小,但您可以只在其中的一部分进行写入,然后将该部分读回主机:

  • 对于第一部分,您应该在 内核,根据您的需要
  • 第二次尝试使用
    clenqueueredbufferrect()
    函数 部分

即使您找到了一个有效的解决方案,您最好不要在内核中使用它。对于线性CPU来说,这是比并行GPU更好的任务。