喂,
我是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 :(得分:1)
如果你在gpu上使用常量内存,则需要使用cudaMemcpyToSymbol而不是cudaMemcpy。