2014-10-06 76 views
0

爲整數分配內存我想在2個2D陣列,1個維數組和2點的整數cudaMlloc(),這樣我可以在我的內核用它來傳遞時得到錯誤。二維數組是雙精度的,其他是int。而1d數組包含浮點數。我不斷收到錯誤「沒有重載函數CudaMalloc的實例相匹配的參數list.argument類型有:(INT,INT)。我不知道我在做什麼錯 內核和我用它的方式是如下:CUDA,試圖在設備

__global__ void getMatrix(double** cmatrix,int** data,float* angle,int x,int y){ 

int j = blockIdx.x * blockDim.x + threadIdx.x; 
int i = blockIdx.y * blockDim.y + threadIdx.y; 

int xrad,yrad; 
xrad = 0; 
yrad = 0; 

xrad = (int)round(cos(angle[i]) * (j+1) + x); 
yrad = (int)round(sin(angle[i]) * (j+1) + y); 

cmatrix[i][j] = (double)data[yrad-1][xrad-1]; 

} 

和實現是:

int dataFileSize = 801 * 1201 * sizeof(int); 
int cmatrixSize = ANGLESIZE * RADIUS/RADSTEP * sizeof(double); 
int xVarSize = sizeof(int); 
int yVarSize = sizeof(int); 

int** d_data; 
cudaMalloc(&d_data,dataFileSize); 

double** d_cmatrix; 
cudaMalloc(&d_cmatrix,cmatrixSize); 

float * d_angle; 
cudaMalloc(&d_angle,sizeof(float) * ANGLESIZE); 

int *d_x; 
cudaMalloc((void**)&d_x,xVarSize); 
int *d_y; 
cudaMalloc((void**)d_y,yVarSize); 

cudaMemcpy(d_data,data,dataFileSize,cudaMemcpyHostToDevice); 
cudaMemcpy(d_cmatrix,cmatrix,cmatrixSize,cudaMemcpyHostToDevice); 
cudaMemcpy(d_angle,angle,sizeof(float) * ANGLESIZE,cudaMemcpyHostToDevice); 
cudaMemcpy(d_x,&x,xVarSize,cudaMemcpyHostToDevice); 
cudaMemcpy(d_y,&y,yVarSize,cudaMemcpyHostToDevice);   

const dim3 blockSize(ANGLESIZE,1,1); 
const dim3 threadSize(1,RADIUS/RADSTEP,1); 

getMatrix<<<blockSize,threadSize>>>(d_cmatrix,d_data,d_angle,d_x,d_y); 

cudaMemcpy(cmatrix,d_cmatrix,cmatrixSize,cudaMemcpyDeviceToHost); 

cudaFree(d_data); 
cudaFree(d_cmatrix); 
cudaFree(d_angle); 
cudaFree(d_x); 
cudaFree(d_y); 

回答

3

你跟cudaMalloc

該行提到的錯誤是不正確的:

int *d_y; 
cudaMalloc((void**)d_y,yVarSize); 

它應該是:

int *d_y; 
cudaMalloc((void**)&d_y,yVarSize); 
       ^
        add this ampersand 

雖然您通過在(void **)投隱藏從編譯器錯誤,所以這不是什麼編譯器的頹勢。

你不能cudaMalloc分配二維數組是這樣的:

int** d_data; 
cudaMalloc(&d_data,dataFileSize); 

double** d_cmatrix; 
cudaMalloc(&d_cmatrix,cmatrixSize); 

而這將引發編譯器錯誤,因爲cudaMalloc需要一個**的說法,不***

它的建議,你壓扁的陣列,並將它們傳遞爲一維數組,如果需要做算術標在你的內核來模擬2D。如果您真的想學習如何傳遞二維數組,請在CUDA二維數組上搜索以獲取一些想法。

是否有你的代碼其他錯誤是很難說,因爲你沒有提供一個完整的代碼。