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

时间:2014-02-17 13:34:41

标签: c++ matlab matrix cuda

我正在研究用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。你有没有人 了解如何访问给定矩阵的内容?

1 个答案:

答案 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