【问题标题】:Changing the size of the array in an OpenCL kernel在 OpenCL 内核中更改数组的大小
【发布时间】:2016-01-23 23:12:05
【问题描述】:

我希望有人可以帮助我。

我需要使用这样的方法将表示矩阵的长数组传递给 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);

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

【问题讨论】:

  • 即使你找到了一个可行的解决方案,你最好不要在内核中这样做。这对于线性 CPU 来说是比并行 GPU 更好的任务。

标签: opencl


【解决方案1】:

也许有专门针对您的问题的解决方法,但总的来说 - 不。您要么隐式地找出新的大小,要么回读显式值。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2019-03-20
      • 2016-10-08
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多