OpenCL - 需要推荐的结构

OpenCL - need to recommended structure

我有两个文件,每个文件有 10000 个点,每个点有两个双数 X 和 Y。 我们需要的是对所有这些点进行操作,所以我们有 10000 0000 次操作(10000 X 10000)。

第一个问题: 你推荐什么结构?我的意思是我应该将哪个变量传递给内核文件?

我已经编写了这个脚本并执行了 1000 个点文件(1000000 次操作),我将所有点放在一个数组中 (1000000 X 4) - 4 来自第一个文件的 X、Y 和 X、Y来自另一个文件 - 并将其传递给内核,所以我有 1000000 个并行线程。

local_item_size = 125
global_item_size = 1000000

第二个问题: 你认为我可以改进这个结构吗?如何改进?

第三个问题: 我编写的脚本对于 1000 个点文件可以正常工作,但是当我 运行 它用于 10000 个点文件时,我遇到了 CL_CREATEBUFFER 错误(CL_INVALID_BUFFER_SIZE 对于 100000000 * 4double 输入数组)。我认为(但我不确定)原因是生成的线程数量巨大(100000000)!!

更新: - 硬件是(Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz,NVIDIA Corporation GM204 [GeForce GTX 980])。 - 我们有 for 循环,每个点有 1000(3 个 ifs)操作,这些操作在内核中完成,每个点的结果完全独立于所有其他点。

更新 2:简化问题 - 我们需要将两个矩阵 A 和 B 相乘,A 有 10000 行和 2 列,B 有 2 行和 10000 列什么是最好的结构?

提前致谢,

我建议尝试使用阻塞方法将问题分解为可管理的块。

创建一个可以处理 32x2 块 A 和 2x32 块 B 的内核。结果应该是 32x32x8 字节,并且适合两个设备的本地内存。根据需要多次调用此内核。

在主计算设备执行其工作时在主机上处理其余元素(即内核未处理的部分块)。

搜索 "matrix multiplication blocking algorithm" 获得了一些不错的点击率。 Here is a good one.

关于更新 2:处理矩阵的最佳方法是将它们存储在行序列中。您需要两个矩阵,每个矩阵包含 20000 个元素。在矩阵 A 中,每行存储 10000 个元素,总共两行。在矩阵 B 中,这给了我们 10.000 行,但每行只有 2 个元素。

看看我的个人资料 blog。有一个基于 OpenCL 的矩阵乘法的(德语)教程。