使用ArrayFire将复杂数字从主机复制到设备

时间:2013-11-19 09:09:26

标签: arrayfire

我正在尝试使用ArrayFire框架将复数数组从主机复制到设备:

std::complex<float> hostArray[131072];
array deviceArray (131072, hostArray); 

但由于数据类型不兼容,它会导致编译错误。我做错了什么?

我可以将实部和虚部分别复制到设备中,以便在gpu内存中创​​建复杂的数字但是代价很高,而且我也不知道如何从ArrayFire框架中的两个数字构造复数。

如果有人能在这件事上帮助我使用ArrayFire框架,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

ArrayFire使用cuComplex(ArrayFire 2.0RC中的cfloat)来存储复数。 cuComplex在内部定义为float2,它是一个包含两个元素的结构。

std :: complex 应该具有相同的结构。您可以执行reinterpret_cast来更改变量的类型,而无需将数据移动到其他数据结构。在我的机器上(Linux Mint with g ++ 4.7.1)我能够使用以下代码从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这样的结构中,以避免编译器相关的问题。

欧麦尔