我有一个算法,我一直在尝试在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);}
不幸的是,此循环执行时间比内核本身要长。所以我的问题是:
所有反馈或意见将不胜感激。谢谢。
答案 0 :(得分:0)
您需要将所有数据上传到GPU,然后调用每个元素具有一个工作项的内核,而不是for循环。
通常,当从CPU到GPU时,最外层的“ for”循环成为内核调用。