2011-03-15 148 views
0

Hallo,将数组传递给Cuda

我是CUDA的新手,我试图将数组数组复制到CUDA内核。林不知道我做错了什么,可以真正做到一些指向正确的方向。

如果我不使用数组来设置数据,则我的UpdatePixel函数可以工作。如果我将colour.x设置为1,则我的整个屏幕变为红色。如果我使用m_dataPtr [index]作为colour.x,则屏幕底部仅有几个像素变为红色(小于5像素)。我已将cuda代码附加到我认为相关的C++代码中。由于代码与colour.x = 1一起工作良好,我怀疑它的cuda代码的拷贝//分配部分被破坏了吗?

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

请显示您调用UpdateImage()的代码。特别是,d_output指向的内存在哪里? – koan 2011-03-15 23:15:11

+0

发布如何为内核构建网格,以及如何调用该函数。 – fabrizioM 2011-03-15 23:42:13

回答

1

如果您正在使用的GPU常量内存,您将需要使用cudaMemcpyToSymbol而非cudaMemcpy。