将数组传递给Cuda

时间:2011-03-15 21:51:26

标签: c++ arrays copy 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);

1 个答案:

答案 0 :(得分:1)

如果你在gpu上使用常量内存,则需要使用cudaMemcpyToSymbol而不是cudaMemcpy。

相关问题