gpt4 book ai didi

pointers - 向量指针在 openCL 中如何工作

转载 作者:行者123 更新时间:2023-12-02 21:46:07 24 4
gpt4 key购买 nike

我正在编写一个示例程序,将 RGB 图像转换为灰度图像。因此,图像作为一维数组从我的主机复制到设备,在我的代码中称为 imgIn。由于 imgIn 是 RGB 图像,因此每个像素由 3 个无符号字符分量(R、G 和 B)组成。由于输出 (imgOut) 是一张灰度图像,因此它仅由一个 channel (亮度)组成。代码如下:

__kernel void rgbToGray(__global const uchar* restrict imgIn, 
__global uchar* restrict imgOut) {
//Get two indexes of the work item
int x = get_global_id(0);
int y = get_global_id(1);
//rgb average is luminosity
//uchar3 channels = *(((__global uchar3 *) imgIn) + (x+640*y));
uchar3 channels = *((__global uchar3 *) (imgIn+3*(x+640*y)));
channels = channels/(uchar3)(3);
imgOut[x+640*y] = channels.s0 + channels.s1 + channels.s2;
}

我想了解为什么 uchar3 channel 的注释声明与未注释的声明不同。当我将 uchar 指针移动到正确的像素,然后将其转换为 uchar3 指针时, channel 变量具有正确的值,并且我的输出图像是完美的。但是,当我将指针转换到 uchar3 像素,然后将指针移动到右侧像素(据说)时,我的图像出现了一种奇怪的图案,如下一行所示。

/image/pjHuR.jpg

最佳答案

根据data types部分在规范中:

For 3-component vector data types, the size of the data type is 4 * sizeof(component). This means that a 3-component vector data type will be aligned to a 4 * sizeof(component) boundary. The vload3 and vstore3 built-in functions can be used to read and write, respectively, 3-component vector data types from an array of packed scalar data type.

如果您需要读取 3 分量向量值,请使用 vload3 。该 doco 明确指出它只会从内存中读取 3 个值:

vload3 and vload_half3 read x, y, z components from address (p + (offset * 3)) into a 3-component vector.

所以像这样的东西应该有效:

uchar3 channels = vload3(x + 640 * y, imgIn);

关于pointers - 向量指针在 openCL 中如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30421904/

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