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);
请显示您调用UpdateImage()的代码。特别是,d_output指向的内存在哪里? – koan 2011-03-15 23:15:11
发布如何为内核构建网格,以及如何调用该函数。 – fabrizioM 2011-03-15 23:42:13