首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ArrayFire将复数从主机复制到设备

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

Stack Overflow用户
提问于 2013-11-19 09:09:25
回答 1查看 775关注 0票数 1

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

代码语言:javascript
复制
std::complex<float> hostArray[131072];
array deviceArray (131072, hostArray); 

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

为了在gpu内存中创建复数,我可以将实部和虚部分别复制到设备中,但这很费钱,而且我也不知道如何在ArrayFire框架中用两个数字来构造复数。

如果有人能在这个问题上帮助我处理ArrayFire框架,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-19 21:41:05

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

情结应该有相同的结构。您可以执行一个reinterpret_cast来更改变量的类型,而不必将数据移动到不同的数据结构。在我的机器上(Linux和g++ 4.7.1),我能够使用以下代码从std::ArrayFire创建一个ArrayFire数组:

代码语言:javascript
复制
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);

输出:

代码语言:javascript
复制
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::复杂类型的大小或数据布局,因此这种方法可能是不可移植的。如果您想要一个可移植的解决方案,我建议将复杂的数据存储在一个结构中,比如float2 2/cfloat,以避免与编译器相关的问题。

奥马尔

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20067333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档