2016-11-05 3 views
0

Ich muss mit einer Float2-Matrix als 1D-Array arbeiten. Ich wollte ein paar Dinge überprüfen, und ich habe diesen Code geschrieben:Float2-Matrix (als 1D-Array) und 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; 
} 

Ich war wie für einen Ausgang warten:

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

Aber das, was ich finde, ist:

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

That bedeutet, dass ich einige Probleme mit der Speicherzuweisung habe (nehme ich an), aber ich kann nicht finden, was mit meinem Code falsch ist. Könnte mir jemand helfen?

+0

[Überprüfen Sie die CUDA fordert Fehler] (http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-für-Fehler-Verwendung der-Cuda-Laufzeit-API. – tera

Antwort

2

Jedes Mal, wenn Probleme mit einem Code CUDA mit, sollten Sie immer proper CUDA error checking verwenden und Ihren Code ausführen mit cuda-memcheck, vor um Hilfe zu bitten.

Auch wenn Sie die Ausgabe nicht verstehen, wird es für andere hilfreich sein, Ihnen zu helfen.

Wenn Sie diesen Code mit cuda-memcheck laufen hätte, hätte Sie bekommen (unter allen anderen Ausgang!) Einige Ausgabe wie folgt:

$ 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 
$ 

Das bedeutet, stimmt etwas nicht mit der Art und Weise konfiguriert Sie Ihren Kernel Start :

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

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

Insbesondere wählt man nicht immer eine Dimension von Null, wenn eine dim3 Variable für die Kernel-Start zu schaffen. Die minimale Dimension für eine Komponente ist 1, nicht null.

So Argumente wie folgt verwenden:

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

Darüber hinaus, wenn Sie beheben, dass Sie immer noch, dass viele Ihrer Ausgänge finden nicht von Ihrem Code berührt. Um dies zu beheben, müssen Sie die Größe des Threadarrays erhöhen, damit sie der Größe Ihres Datenarrays entspricht. Da Sie ein 1-D-Array haben, ist mir nicht wirklich klar, warum Sie 2D-Threadblocks und 2D-Grids starten. Ihre Daten Array sollte mit insgesamt 65.536 Fäden in einer linearen Dimension, so etwas wie dies vollständig „abdeckbar“ sein:

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