将存储在主机内存中的 2d 图像传输到 OpenCL 时,它如何读取值 - 主要行还是主要列?让我们假设行专业。
index = row*NUM_COLS + col
存储在主机内存中的 3d 图像怎么样?我相信这被视为一堆 2D 图像(假设是行主要的)。然后像素 (row,col,slice) 在 OpenCL 方面的限制 (NUM_ROWS,NUM_COLS,NUM_SLICES) 位于:
index = slice*NUM_ROWS*NUM_COLS + row*NUM_COLS + col
但是,根据维基百科公式,3d Row Major 索引应该是:
index = slice + NUM_SLICES*(col + NUM_COLS*row)
= row*NUM_COLS*NUM_SLICES + col*NUM_SLICES + slices
根据同一篇文章 Column Major Ordering 访问应该是:
index = row + NUM_ROWS*(col + NUM_COLS*slice)
= slice*NUM_ROWS*NUM_COLS + col*NUM_ROWS + row
这些似乎都与 OpenCL 在 3d 案例中所做的相匹配。
所以我想我真的有两个问题
- 如何布局内存以将 2d 和 3d 图像传输到 OpenCL?
- 为什么看起来 OpenCL 在 3d 案例中选择了非标准的内存布局?
编辑
我将维基百科文章视为通用布局方案。“行”或“列”是辅助标签词。无论您是处理限制为 (NUM_ROWS, NUM_COLS, NUM_SLICES) 还是 (x,y,z) (WIDTH, HEIGHT, DEPTH) 的元组 (row, col, slice) 都无关紧要,只要它是一致的。它只是告诉你哪个维度在内存中是连续的。在“主要行”中,它是最后一个维度 - z 值彼此相邻,在主要列中,它是第一个维度 - x。
所以我再一次认为 x,y,z 3d 图像索引的“主要行”布局应该是:
index = z + DEPTH * (y + HEIGHT * x) = x * HEIGHT * DEPTH + y * HEIGHT + z
它不是。但是,我想你可以选择任何你想要的方案。