gpt4 book ai didi

c++ - 将数组传递给 Cuda

转载 作者:行者123 更新时间:2023-11-28 08:22:25 24 4
gpt4 key购买 nike

你好,

我是 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);

最佳答案

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

关于c++ - 将数组传递给 Cuda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5318536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com