2016-11-05 79 views
0

我必須使用float2矩陣作爲一維數組。我想查一些東西,我寫了這個代碼:float2矩陣(作爲一維數組)和CUDA

#include <stdio.h> 
#include <stdlib.h> 

#define index(x,y) x+y*N 

__global__ void test(float2* matrix_CUDA,int N) 
{ 
    int i,j; 

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

    matrix_CUDA[index(i,j)].x=i; 
    matrix_CUDA[index(i,j)].y=j; 

} 

int main() 
{ 
    int N=256; 

    int i,j; 

    ////////////////////////////////////////// 

    float2* matrix; 

    matrix=(float2*)malloc(N*N*sizeof(float2)); 

    ////////////////////////////////////////// 

    float2* matrix_CUDA; 

    cudaMalloc((void**)&matrix_CUDA,N*N*sizeof(float2)); 

    ////////////////////////////////////////// 

    dim3 block_dim(32,2,0); 
    dim3 grid_dim(2,2,0); 

    test <<< grid_dim,block_dim >>> (matrix_CUDA,N); 

    ////////////////////////////////////////// 

    cudaMemcpy(matrix,matrix_CUDA,N*N*sizeof(float2),cudaMemcpyDeviceToHost); 


    for(i=0;i<N;i++) 
    { 
     for(j=0;j<N;j++) 
     { 
      printf("%d %d, %f %f\n",i,j,matrix[index(i,j)].x,matrix[index(i,j)].y); 
     } 
    } 


    return 0; 
} 

我在等一個輸出,如:

0 0, 0 0 
0 1, 0 1 
0 2, 0 2 
0 3, 0 3 
... 

但我發現的東西是:

0 0, -nan 7.265723657 
0 1, -nan 152345 
0 2, 25.2135235 -nan 
0 3, 52354.324534 24.52354234523 
... 

那意味着我對內存分配有一些問題(我想),但是我找不到我的代碼出了什麼問題。有人能幫助我嗎?

+0

[查看您的CUDA呼籲錯誤](http://stackoverflow.com/questions/14038589 /什麼,是最規範的路到檢查換錯誤 - 使用最CUDA的運行時API)。 – tera

回答

2

您有一個CUDA代碼的麻煩任何時候,你應該總是使用proper CUDA error checkingcuda-memcheck之前運行代碼,尋求幫助。

即使您不瞭解輸出結果,對其他嘗試幫助您的人也會有所幫助。

如果您有相關cuda-memcheck運行這段代碼,你會得到(其中包括所有其他的輸出!)這樣的一些輸出:

$ cuda-memcheck ./t1273 
========= CUDA-MEMCHECK 
========= Program hit cudaErrorInvalidConfiguration (error 9) due to "invalid configuration argument" on CUDA API call to cudaLaunch. 
=========  Saved host backtrace up to driver entry point at error 
=========  Host Frame:/lib64/libcuda.so.1 [0x2eea03] 
=========  Host Frame:./t1273 [0x3616e] 
=========  Host Frame:./t1273 [0x2bfd] 
=========  Host Frame:./t1273 [0x299a] 
=========  Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21b15] 
=========  Host Frame:./t1273 [0x2a5d] 
========= 
========= ERROR SUMMARY: 1 error 
$ 

這意味着什麼是錯的方式,你配置你的內核啓動:

dim3 block_dim(32,2,0); 
dim3 grid_dim(2,2,0); 

test <<< grid_dim,block_dim >>> (matrix_CUDA,N); 
     ^^^^^^^^^^^^^^^^^^ 
     kernel config arguments 

具體來說,你永遠不要創建內核啓動一個dim3變量時選擇的零維度。任何組件的最小尺寸是1,而不是零。

因此,使用的參數是這樣的:

dim3 block_dim(32,2,1); 
dim3 grid_dim(2,2,1); 

此外,一旦你解決這個問題,你還是會發現很多你的輸出不會被你的代碼所感動。爲了解決這個問題,你需要增加線程數組的大小來匹配數據數組的大小。既然你有一個一維數組,我不清楚你爲什麼要啓動2D線程塊和2D網格。您的數據陣列應該是完全「可覆蓋的」與線性維度共65536個線程,這樣的事情:

dim3 block_dim(32,1,1); 
dim3 grid_dim(2048,1,1);