【发布时间】:2013-09-22 12:15:11
【问题描述】:
我正在处理图像立方体 (450x450x1500) 的大型数据集。我有一个适用于单个数据元素的内核。每个数据元素产生 6 个中间结果(浮点数)。我的块由 1024 个线程组成。每个线程(6 个浮点数组)将 6 个中间结果存储在共享内存中。但是,现在我需要添加每个中间结果以产生总和(6 个总和值)。我没有足够的全局内存来将这 6 个浮点数组保存到全局内存中,然后从主机代码中运行推力或任何其他库的缩减。
是否有任何可以从共享内存中数组的内核函数内部调用的归约例程?
解决此问题的最佳方法是什么?我是 CUDA 编程的新手,欢迎提出任何建议。
【问题讨论】:
-
“6 个总和值”是指最终结果仅包含 6 个浮点数,还是仅对 6 个浮点数进行 450x450x1500 次的缩减?
-
最终结果包含 6 个浮点数。总和超过第三维 (1500)。所以我最终需要得到 450x450x6 的浮点数。
-
那么你的图像立方体是如何存储在全局内存中的?一帧一帧像
image[1500][450][450]或一个像素一个像素像image[450][450][1500] -
它首先沿着 z,然后沿着 x 和 y。所以图像[1500] [450] [450]。我有一个线程处理每个体素。由于一个块不能有 1500 个线程,我每个块使用 512 个线程并将 1500 个线程分成三个块。我最终需要从所有三个块中累积结果。我在想我将使用临时全局内存(450x450x6)来保存每个块的中间总和值。这是一个好方法吗?
-
您不需要使用多个块或多个线程对一个 1500 维向量求和。对于您的情况,使用一个线程就足够了。请参阅我的更新答案。
标签: cuda