【发布时间】:2021-05-08 10:43:31
【问题描述】:
这是我假设知道的:在控制台中打印变量“i”时,通常使用命令“std::cout
但在下面的(经典 CUDA FFT)C++ 示例中,这不起作用,我不知道为什么。这是代码sn-p(为了清楚起见,我不想发布整个代码):
cufftExecR2C(fftPlanFwd, (cufftReal *)d_PaddedData, (cufftComplex *)d_DataSpectrum);
for (int i = 0; i < 8; i++)
{
std::cout << (cufftComplex*)d_DataSpectrum << '\n';
}
“cufftExecR2C”是“实数到复数”命令,用于将变量“d_PaddedData”中的数字 0 到 8 进行傅里叶变换到具有复数的变量“d_DataSpectrum”。我认为这些是指针。
我想检查其余代码是否按预期工作并打印出变量。问题:我得到了 9 次:“000000070CE00C00”打印在控制台中,这在我看来是地址而不是变量的数据?
我尝试了以下组合,而不是 (cufftComplex*)d_DataSpectrum:“*d_DataSpectrum”、“d_DataSpectrum”、“*d_DataSpectrum[0]”、“d_DataSpectrum[0]”。后两者很可能是复杂变量存储在两列数组中。只有“d_DataSpectrum”可以编译成功但也给我000000070CE00C00。
我想知道我是否错过了获取该指针数据的任何技巧?
编辑:
声明
fComplex *d_DataSpectrum;
cudaMalloc((void **)&d_DataSpectrum, fftH * (fftW / 2 + 1) * sizeof(fComplex))
这两行代码都可以编译,但会导致 .exe 在此时调用时崩溃:
std::cout << "The Original data is " << d_PaddedData[i] << '\n';
std::cout << "The FFT'd data is" << ((cufftComplex*)d_DataSpectrum)[i].x << '\n'; //crash even with added 'd_DataSpectrum)[i].y' as recommended
编辑2:
用“&”编辑它后:
std::cout << "The Original data is " << &d_PaddedData[i] << '\n';
std::cout << "The FFT'd data is" << &((cufftComplex*)d_DataSpectrum)[i].x << '\n';
它运行:
The FFT'd data is000000070CE00C10
The Original data is 000000070CE0040C
The FFT'd data is000000070CE00C18
The Original data is 000000070CE00410
The FFT'd data is000000070CE00C20
The Original data is 000000070CE00414
The FFT'd data is000000070CE00C28
为什么“&”现在起作用了?
【问题讨论】:
-
仅根据 CUDA 文档和对您的代码的一些假设进行猜测,但我会尝试
std::cout << ((cufftComplex*)d_DataSpectrum)[i].x << ' ' << ((cufftComplex*)d_DataSpectrum)[i].y << '\n'; -
了解
d_DataSpectrum的声明方式会有所帮助。 -
谢谢,你们俩都是金子。我添加了声明。
-
那么崩溃是一个完全不同的问题。您的代码中有一些错误,恐怕我没有使用 CUDA 的经验,所以我不知道它是什么。
-
我认为崩溃是由
fComplex和cufftComplex之间的混淆引起的。您的代码似乎无法决定您真正想要这两种类型中的哪一种。你不能只是混合搭配不同的类型。