我正在使用Cuda和C ++开发信号处理链,但是我的设备数据管道有问题。假设我有一个大小为x y z的(小)缓冲区和另一个大小为x y w的(大)缓冲区,其中w是z的倍数。 / p>
首先,该链用许多FFT(cufft)的结果填充小缓冲区,效果很好。然后,应使用简单的cudaMemcpy
将小缓冲区附加到大缓冲区的末尾。我知道它在C ++中通常如何工作,但是cudaMemcpy
每次都会覆盖大缓冲区的第一个元素,并且不会在末尾附加它们。
该代码段显示了我的内存复制实现。
cufftComplex* largeBuf;
cufftComplex* smallBuf;
int pos = 0;
//Do allocation stuff
...
while(flag)
{
...
// Cuda memcpy dev to dev
CUDA_CHECK(cudaMemcpy(
(void*)&largeBuf[pos],
(void*)smallBuf,
smallBuf->getSize(),
cudaMemcpyDeviceToDevice
));
pos += smallBuf->getSize()/sizeof(cufftComplex);
}
谢谢!
答案 0 :(得分:-2)
这是将数据从一个缓冲区顺序复制到另一个更大的缓冲区的正确方法,但是您可能会错误地计算指针偏移量。 smallBuff->getSize()
无效,因为cufftComplex只是一个float2结构,因此请检查您实际上在做什么以更新指针位置。