2014-02-17 43 views
-2

我正在並行化一個用Matlab編寫的程序。如何索引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

你可能已經得到了你的代碼來用'int ** image'進行編譯,但除非你仔細處理@talonmies給出的鏈接,以及下面給出的答案,否則這就是你會得到的。 –

+1

如果你沒有注意到,你的代碼格式是一個完整的混亂。代碼行應通過縮進4個空格與問題文本分開格式化。不要在您發佈的每一行的開頭放置特殊的格式化字符'>'。如果您想在此發佈問題,請通過計算出適當的格式,讓其他人閱讀並重新編輯您的問題,直到格式正確爲止。 –

+0

哦!我沒有注意到它現在:/ sry編輯:我更新了問題 – TheTrueFreeStyle

回答

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 *傳遞,則必須以1D數組的形式訪問它。 CUDA代碼不知道圖像的尺寸是什麼。每當你要搶你需要使用(假設行優先順序)的一些圖像數據,

image[y*x_size + x]; 

三是你的代碼是不平行的。在計算過程中,您從來沒有參考過「線程」的值,所以您基本上並行地對整個圖像進行多次相同的串行計算。我會建議查看一些非常基本的CUDA代碼,以瞭解它如何工作。 UDACITY在CUDA和並行編碼方面有很棒的在線視頻課程,我強烈建議。 https://www.udacity.com/course/cs344

+0

大多數有效的點,但是由於OP提到matlab,大概使用mex或PTX接口,沒有「主機代碼」來檢查。 Matlab在調用提供的內核之前在內部完成所有設置。 –

+0

是的,這是我的問題:/但我想我可以解決它時,我重塑形象,並做一維數組thingy:D – TheTrueFreeStyle

+0

我做同樣的計算是因爲我想測試代碼之前的實際點添加實際平行部分(徑向平均部分)... – TheTrueFreeStyle