gpt4 book ai didi

c++ - 访问每个矩阵点

转载 作者:行者123 更新时间:2023-11-28 06:50:31 26 4
gpt4 key购买 nike

当我尝试访问 CUDA 内核中矩阵的每个点时遇到问题。我正在使用 OpenCV,我正在尝试在矩阵的每个点上“做某事”。所以,我正在将 uint8_t 矩阵转换为 float 矩阵,如下所示:

for(int i=0; i<inputMatrix.rows; ++i){
for(int j=0; j<inputMatrix.cols * cn; j+=cn){
examMatrix[i*inputMatrix.cols*cn + j + 0] = pixelPtr[i*inputMatrix.cols*cn + j + 0]; // B
examMatrix[i*inputMatrix.cols*cn + j + 1] = pixelPtr[i*inputMatrix.cols*cn + j + 1]; // G
examMatrix[i*inputMatrix.cols*cn + j + 2] = pixelPtr[i*inputMatrix.cols*cn + j + 2]; // R
}
}

这适用于 3 channel 图像,因为如果我从该矩阵创建输出图像(在反向转换为 uint8_t 之后)看起来与输入相同。但我想使用 CUDA 进行一些更改:

我这样设置 block 大小和网格大小:

dim3 dimBlock(count, 3);
dim3 dimGrid( frameHeight/count, frameWidth/count);

其中count是线程数,3是 channel 数,frameHeightframeWidth是帧大小。

因此,我分配了 GPUexamMatrixGPUresultMatrix 并尝试访问内核中的每个点。我的内核看起来像这样:

resultMatrix[(blockIdx.x * blockIdx.y) + (threadIdx.x * threadIdx.y)] = examMatrix[(blockIdx.x * blockIdx.y) + (threadIdx.x * threadIdx.y)];

因此,如您所见,我尝试简单地复制矩阵。完成此操作后,当我将矩阵返回到主机并打印它时,我在矩阵中得到了非常小或非常大的 float 数字,但不是检查矩阵中的数字。

我想我在内核中做错了什么。有什么想法吗?

最佳答案

您对内置变量的使用不可能是正确的。仅举一个简单的例子,threadIdx.x = 0 和 threadIdx.y = 2 将访问与 threadIdx.x = 2 和 threadIdx.y = 0 相同的点。您没有唯一索引。我可以尝试给你一些有用的东西,但我对你的 dimBlock 变量有点困惑。简而言之,这不是我设置网格/ block /索引来处理二维数组的方式。我不会在我的线程 block 尺寸标注中使用 channel 号 3

尝试这样的事情:

// make sure count is small like 16: count*count<512 or 1024 depending on GPU
dim3 dimBlock(count, count);
dim3 dimGrid( frameWidth/dimBlock.x, frameHeight/dimBlock.y);

在你的内核中:

int row = threadIdx.y + blockIdx.y*blockDim.y;
int col = threadIdx.x + blockIdx.x*blockDim.x;

resultMatrix[3*(row*frameWidth + col) + 0] = examMatrix[3*(row*frameWidth + col) + 0];
resultMatrix[3*(row*frameWidth + col) + 1] = examMatrix[3*(row*frameWidth + col) + 1];
resultMatrix[3*(row*frameWidth + col) + 2] = examMatrix[3*(row*frameWidth + col) + 2];

上面假设 frameWidthframeHeight 可以被 count 整除

关于c++ - 访问每个矩阵点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24045408/

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