我正在尝试使用ArrayFire框架将复数数组从主机复制到设备:
std::complex<float> hostArray[131072];
array deviceArray (131072, hostArray);
但由于数据类型不兼容,它会导致编译错误。我做错了什么?
我可以将实数和虚数分别复制到设备中,以便在gpu内存中创建复数,但这很昂贵,而且我也不知道如何在ArrayFire框架中从两个数字构建复数。
如果有人能在这件事上帮助我使用ArrayFire框架,我将不胜感激。
ArrayFire使用cuComplex(ArrayFire2.0RC中的cfloat)来存储复数。cuComplex在内部被定义为float2,它是一个包含两个元素的结构。
std::complex应该具有相同的结构。您可能可以执行reinterpret_cast来更改变量的类型,而无需将数据移动到不同的数据结构中。在我的机器上(带有g++4.7.1的Linux Mint),我能够使用以下代码从std::complex创建一个ArrayFire数组:
int count = 10;
std::complex<float> host_complex[count];
for(int i = 0; i < count; i++) {
std::real(host_complex[i]) = i;
std::imag(host_complex[i]) = i*2;
}
array af_complex(count, reinterpret_cast<cuComplex*>(host_complex));
print(af_complex);
输出:
af_complex =
0.0000 + 0.0000i
1.0000 + 2.0000i
2.0000 + 4.0000i
3.0000 + 6.0000i
4.0000 + 8.0000i
5.0000 + 10.0000i
6.0000 + 12.0000i
7.0000 + 14.0000i
8.0000 + 16.0000i
9.0000 + 18.0000i
洞穴
据我所知,C++标准没有指定std::complex类型的大小或数据布局,因此这种方法可能不可移植。如果您想要一个可移植的解决方案,我建议将复杂数据存储在float2/cfloat这样的结构中,以避免与编译器相关的问题。
Umar