如何在CUDA内核中索引Matlab数组

How to index a Matlab array inside a CUDA kernel

本文关键字:索引 Matlab 数组 内核 CUDA      更新时间:2023-10-16

我正在对用Matlab编写的程序进行并行化。

目前我有以下代码:

#define _USE_MATH_DEFINES
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <math.h>
__global__ void radialAverage(double** image, int x_center, int y_center)
{
int i, x, y;
const int x_size = 400;
const int y_size = 400;
int thread = blockIdx.x*blockDim.x+threadIdx.x;
double angle     = 0;
double dAngle    = M_PI/360;
double radImgMat[x_size][y_size];
double angleMatPi[x_size][y_size];

//radImMap erstellen
for( x = 0; x < x_size; x++) {
for( y = 0; y < y_size; y++) {
radImgMat[x][y]  = sqrt((double)(x+1-x_center)*(x+1-x_center) + (y+1-y_center)*(y+1-y_center));
}
}
//Angle-Matrix (pi-pi) erstellen
for ( x = 0; x < x_size; x++) {
for( y = 0; y < y_size; y++) {
float xD = x+1-x_center;
float yD = y+1-y_center;
if(yD>0) {
angleMatPi[x][y] = -1*(atan(xD/yD)+M_PI/2)+M_PI;
} else if(yD==0 && xD<0) {
angleMatPi[x][y] = M_PI;
} else if(yD==0 && xD>0) {
angleMatPi[x][y] = 0;
} else {
angleMatPi[x][y] = -1*(atan(xD/yD)+M_PI/2);
}
}
}
//Cut ImgMat
for(x=0; x < x_size; x++) {
for(y = 0; y < y_size; y++) {
if((angleMatPi[x][y] < (angle-dAngle)) || (angleMatPi[x][y] > (angle+dAngle))) {
image[x][y] = 0;
}               
}
}
}

在纯C++中,它运行得非常好,但当我尝试为int* image矩阵编制索引,该矩阵应为2D。你们中有人吗对如何访问给定矩阵的内容有想法吗?

我看到代码有三个问题。首先,我们需要确保图像数据被复制到GPU并传递到内核。您可能已经这样做了,但我们需要查看主机代码才能知道。在主机上运行的代码应该是这样的,

int *d_image;
cudaMalloc((void**)&d_image,x_size*y_size*sizeof(int)); //allocate memory on the GPU for the image
cudaMemcpy(d_image,image,x_size*y_size*sizeof(int),cudaMemcpyHostToDevice); //copy the image to GPU global memory
radialAverage<<<numBlocks,numThreads>>>(d_image,x_size,y_size,x_center,y_center); //Call CUDA kernel with device pointer to image data

这应该可以解决引用图像数据时崩溃的问题。其次是索引图像的方式。若将image作为int*传递,则必须将其作为1D数组进行访问。CUDA代码不知道图像的尺寸是多少。每当你想获取一些图像数据时,你需要使用这个(假设行主要顺序),

image[y*x_size + x];

第三,您的代码根本不是并行的。在计算过程中,你从来没有引用过"thread"的值,所以你基本上是在对整个图像进行多次并行的串行计算。我建议查看一些非常基本的CUDA代码,了解它是如何工作的。UDACITY有一个关于CUDA和并行编码的很棒的在线视频课程,我强烈推荐。https://www.udacity.com/course/cs344