2011-03-15 5 views
0

Hallo,tableaux Passing à Cuda

Je suis nouveau à CUDA et Im essayant de copier un tableau de données dans le noyau CUDA. Je ne suis pas sûr de ce que je fais mal et je pourrais vraiment faire avec quelques indications dans la bonne direction.

Ma fonction UpdatePixel fonctionne si je n'utilise pas le tableau pour définir les données. Si je mets la couleur x à 1, tout mon écran devient rouge. Si j'utilise m_dataPtr [index] comme couleur.x seulement quelques pixels vers le bas de l'écran deviennent rouges (moins de 5 pixels). J'ai joint le code cuda au code C++ que je pense être pertinent. Comme le code fonctionne bien avec colour.x = 1, je suppose que c'est la partie copy // allocation du code cuda qui est cassé?

CUDA:

#include <cutil_inline.h> 
#include <cutil_math.h> 

__constant__ float* m_dataPtr; 

__device__ unsigned int rgbaFloatToInt_new(float4 rgba) 
{ 
    rgba.x = __saturatef(rgba.x); // clamp to [0.0, 1.0] 
    rgba.y = __saturatef(rgba.y); 
    rgba.z = __saturatef(rgba.z); 
    rgba.w = __saturatef(rgba.w); 
    return (uint(rgba.w*255)<<24) | (uint(rgba.z*255)<<16) | (uint(rgba.y*255)<<8) | uint(rgba.x*255); 
} 

__global__ void UpdatePixel(unsigned int *outputImage, unsigned int imageW, unsigned int imageH) 
{ 
    uint x = blockIdx.x*blockDim.x + threadIdx.x; 
    uint y = blockIdx.y*blockDim.y + threadIdx.y; 
    unsigned int index = y * imageW + x; 

    float data = m_dataPtr[index]; 
    float4 colour; 
    colour.x = data; 
    colour.y = 0; 
    colour.z = 0; 
    colour.w = 1; 

    outputImage[index] = rgbaFloatToInt_new(colour); 
} 

extern "C" void UpdateImage(dim3 gridSize, dim3 blockSize,uint *d_output, uint imageW, uint imageH) 
{ 
    UpdatePixel<<<gridSize, blockSize>>>(d_output, imageW, imageH); 
} 

extern "C" void AllocateData(size_t dataSize) 
{ 
    cudaFree(m_dataPtr); 
    cutilSafeCall(cudaMalloc((void**)&m_dataPtr, dataSize)); 
} 

extern "C" void CopyData(float *dataPtr, size_t dataSize) 
{ 
    cutilSafeCall(cudaMemcpy(m_dataPtr, dataPtr, dataSize, cudaMemcpyHostToDevice)); 
} 

C++:

float *pixelData = new float[imageWidth * imageHeight]; 
    unsigned int pixelDataSize = (sizeof(float) * imageWidth * imageHeight); 

    for(unsigned int x = 0; x < imageWidth; x++) 
    { 
     for(unsigned int y = 0; y < imageHeight; y++) 
     { 
      unsigned int idx = imageWidth * y + x; 
      pixelData[idx] = 1; 
     } 
    } 

    AllocateData(pixelDataSize); 
    CopyData(pixelData, pixelDataSize); 
+0

Veuillez indiquer le code où vous appelez UpdateImage(). En particulier, où est la mémoire vers laquelle d_output pointe? – koan

+0

Indiquez comment vous construisez la grille pour le noyau et comment vous appelez la fonction. – fabrizioM

Répondre

1

Si vous utilisez la mémoire constante sur le gpu, vous devez utiliser cudaMemcpyToSymbol plutôt que cudaMemcpy.