gpt4 book ai didi

OpenCL image2d 和 image3d 内存布局

转载 作者:行者123 更新时间:2023-12-02 00:07:03 26 4
gpt4 key购买 nike

将存储在主机内存中的二维图像传输到 OpenCL 时,它如何读取值 - 行主要还是列主要?让我们假设行专业。

index = row*NUM_COLS + col

如何将 3d 图像存储在主机内存中?我相信这被视为一堆 2D 图像(假定为行主要)。然后,就 OpenCL 而言,限制 (NUM_ROWS、NUM_COLS、NUM_SLICES) 的像素(行、列、切片)位于:

index = slice*NUM_ROWS*NUM_COLS + row*NUM_COLS + col

然而,根据wikipedia 3d 行主要索引的公式应该是:

index = slice + NUM_SLICES*(col + NUM_COLS*row) 
= row*NUM_COLS*NUM_SLICES + col*NUM_SLICES + slices

根据同一篇文章 Column Major Ordering access should be:

index = row + NUM_ROWS*(col + NUM_COLS*slice)
= slice*NUM_ROWS*NUM_COLS + col*NUM_ROWS + row

这些似乎都不符合 OpenCL 在 3d 情况下所做的事情。

所以我想我真的有 2 个问题

  1. 如何布置内存以将 2d 和 3d 图像传输到 OpenCL?
  2. 为什么 OpenCL 在 3d 情况下似乎选择了非标准内存布局?

编辑

我将维基百科文章视为通用布局方案。 “行”或“列”是二级标签词。无论您处理的元组 (row, col, slice) 限于 (NUM_ROWS, NUM_COLS, NUM_SLICES) 还是 (x,y,z) (WIDTH, HEIGHT, DEPTH) 都没有关系,只要它是一致的。它只是告诉你哪个维度在内存中是连续的。在“主要行”中,它是最后一个维度 - 彼此相邻的 z 值,在主要列中,它是第一个维度 - x。

所以我再次认为 x、y、z 3d 图像索引的“主要行”布局应该是:

index = z + DEPTH * (y + HEIGHT * x) = x * HEIGHT * DEPTH + y * HEIGHT + z

事实并非如此。但是,我想你可以选择任何你想要的方案。

最佳答案

首先,您对 OpenCL 布局的假设是正确的。 OpenCL 确实使用了您描述的布局,并且您为 2D 和 3D 情况提供的公式都是正确的,一个接一个的组件,一个接一个的像素,一个接一个的行,一个接一个的切片。我(拥有 OpenGL 背景)认为这是非常标准的。

但是这里有一点命名困惑,因为 row-major in general 的意思是 Wikipedia 所说的,第一个维度以最低的频率变化并且最后一个维度是连续的。然而对于图像,行实际上不是第一维度,而是y维度,而列是x。因此,虽然 OpenCL(至少在 2D 中)使用文字 “行优先” 布局(因为行更改频率较低),但通常可以看到(在 维基百科) 而不是列优先,因为第一个维度 (x) 是连续的。这很好地转化为 3D,其中最后一个维度 (z) 以最低频率变化。所以你把维基百科弄错了,它实际上是说一般列主要(扩展到 3D)是

index = z*WIDTH*HEIGHT + y*WIDTH + x

考虑到 x=coly=row,这确实是

index = slice*NUM_ROWS*NUM_COLS + row*NUM_COLS + col

这正是 OpenCL 使用的。所以回答你实际的问题:

  1. 正如您在问题的第一部分所解释的那样。

  2. 因为你弄错了维基百科,混淆了基于矩阵的 (row,col)-indexing 和基于图像的 (x,y)-indexing 等等OpenCL 使用的是维基百科通常所说的列优先。

编辑:这种混淆基于索引的寻址(如矩阵)和基于坐标的寻址(如图像)是一个常见的混淆来源。例如,在 OpenCV(一个著名的图像处理库)中,图像被表示和寻址为矩阵,因此像 (row,col),对于实际图像意味着 (y,x).

关于OpenCL image2d 和 image3d 内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17704216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com