Алло,
Я новичок в 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);