【问题标题】:OpenCL - need to recommended structureOpenCL - 需要推荐的结构
【发布时间】:2015-05-12 09:04:47
【问题描述】:

我有两个文件,每个文件有 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 错误(100000000 * 4double 输入数组的 CL_INVALID_BUFFER_SIZE)。我认为(但我不确定)原因是生成的线程数量巨大(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 列 最好的结构是什么?

提前致谢,

【问题讨论】:

  • 您使用的是什么硬件?每个点的计算量有多大?它只是几个操作还是更大的东西?每个点的操作是否完全独立于所有其他点? (平凡的并行任务)?
  • 在这个stackoverflow.com/questions/8520421/… 问题上,这实际上可能是一个问题,您可以看到您超过了最大大小。可能有帮助的是创建一个多维指针数组。喜欢这里:cplusplus.com/forum/articles/7459
  • 此外,我同意@Krystian 的观点,请向我们提供更多详细信息,说明您现在如何布置您的清单。以及您执行哪些操作。
  • @Krystian @Laurisvr,我更新了问题并添加了所需的详细信息
  • 一个简单的建议:使用矢量数据类型。对于 x 和 y 坐标,您可以使用 float2 而不是两个浮点数。

标签: c++ structure opencl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    搜索“矩阵乘法阻塞算法”得到了一些不错的结果。 Here is a good one.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2014-12-17
      • 2011-01-12
      • 1970-01-01
      相关资源
      最近更新 更多