如何减少OpenCL入队时间/其他任何想法?

时间:2018-08-10 12:14:01

标签: parallel-processing opencl gpu gpgpu hardware-acceleration

我有一个算法,我一直在尝试在nVidia上使用OpenCL加速它。

它必须处理大量数据(比如说100k到百万),其中每个数据:必须首先更新矩阵(在设备上)(使用数据和两个向量);并且只有在更新整个矩阵之后,两个向量(同样在设备上)才使用相同的数据进行更新。所以,我的主机代码看起来像这样

for (int i = 0; i < milions; i++) {
        clSetKernelArg(kernel_matrixUpdate, 7, sizeof(int), (void *)&i); 
        clSetKernelArg(kernel_vectorsUpdate, 4, sizeof(int), (void *)&i);       
        clEnqueueNDRangeKernel(command_queue, kernel_matrixUpdate, 1, NULL, &global_item_size_Matrix, NULL, 0, NULL, NULL);
        clEnqueueNDRangeKernel(command_queue, kernel_vectorsUpdate, 1, NULL, &global_item_size_Vectors, NULL, 0, NULL, NULL);}

不幸的是,此循环执行时间比内核本身要长。所以我的问题是:

  • 有什么方法可以使N个内核更高效地入队吗?
  • 有没有什么方法可以先更新整个矩阵,然后再更新向量,而无需使用单独的内核?例如。设备是否按顺序运行内核(即第一个工作组的值为0,1,...,63;第二个工作组的值为64,...)?但是我想那还是个不好的习惯...
  • 还有其他想法吗? :D

所有反馈或意见将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

您需要将所有数据上传到GPU,然后调用每个元素具有一个工作项的内核,而不是for循环。

通常,当从CPU到GPU时,最外层的“ for”循环成为内核调用。