我正在研究用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。你有没有人
了解如何访问给定矩阵的内容?
答案 0 :(得分:0)
我发现代码存在三个问题。首先,我们需要确保将图像数据复制到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
这应该可以解决引用图像数据时的崩溃问题。第二是你索引图像的方式。如果将图像作为int *传递,则必须将其作为一维数组进行访问。 CUDA代码不知道图像的尺寸是什么。每当你想要获取一些图像数据时,你需要使用它(假设行主要顺序),
image[y*x_size + x];
第三,你的代码根本不是平行的。你从来没有在计算过程中引用'thread'的值,所以你基本上在整个图像上并行多次进行相同的串行计算。我建议查看一些非常基本的CUDA代码,以了解其工作原理。 UDACITY有一个很棒的关于CUDA和并行编码的在线视频课程,我强烈推荐。 https://www.udacity.com/course/cs344