Передача массивов в Cuda - PullRequest
       7

Передача массивов в Cuda

0 голосов
/ 16 марта 2011

Алло,

Я новичок в 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 Ответ

1 голос
/ 16 марта 2011

Если вы используете постоянную память в графическом процессоре, вам нужно будет использовать cudaMemcpyToSymbol, а не cudaMemcpy.

...