c++ - 来自复杂主机数据的 Arrayfire 数组

标签 c++ complex-numbers arrayfire

我在从主机数据初始化 arrayfire 数组时遇到问题。

以下代码不会为我链接:

constexp int mNumEigenInfos = 100;
std::complex<float> mEigenVectors[mNumEigenInfos][6];
af::array mEigenVectorsArray = af::array((dim_t)6,(dim_t)(mNumEigenInfos),reinterpret_cast<float2*>(mEigenVectors));

给我一个错误:
undefined reference to `af::array::array<float2>(long long, long long, float2 const*, af_source)'

现在,如果我将 reinterpret_cast 从 float2* 更改为 float*:
constexp int mNumEigenInfos = 100;
std::complex<float> mEigenVectors[mNumEigenInfos][6];
af::array mEigenVectorsArray = af::array((dim_t)6,(dim_t)(mNumEigenInfos),reinterpret_cast<float*>(mEigenVectors));

它链接很好。通过在线阅读,我认为我应该将复杂数据视为 cuComplex (将其转换为 float2 或 cuComplex 会给出完全相同的错误,因为它们是相同的)。

我觉得我在这里犯了一个愚蠢的错误,但似乎无法弄清楚。

我应该如何从 std::complex 主机数据初始化 arrayfire 数组?

感谢您的帮助

最佳答案

这有点类似于问题 af::array::device doesn't work with complex arrays请看一看 - 唯一的区别是传递复杂数据的方向。

以下应该可以正常工作 std::complex应该与 af::cfloat ABI 兼容.

af::array mEigenVectorsArray =
    af::array((dim_t)6, (dim_t)(mNumEigenInfos),
              reinterpret_cast<af::cfloat>(mEigenVectors));

ArrayFire API 将没有函数符号 float2类型,但是它将具有类型为 af::cfloat 的函数符号.偶cuFloatComplextfloat2还应该与 af::cfloat 兼容 ABI我认为。因此,重新解释转换为 af::cfloat是应该做什么。

关于c++ - 来自复杂主机数据的 Arrayfire 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59424886/

相关文章:

c++ - 为什么 checked_array_iterator 在 VS2013 中不包含 <iterator> 就可以工作,但在 VS2017 中却失败了?

c++ - 模板中的 pimpl 成语;哪个智能指针?

algorithm - 如何计算离散傅里叶变换?

c++ - 如果模板参数复杂,则在模板函数中应用std::conj

python - ArrayFire 和 Python

c++ - boost::lexical_cast 对于 c++11 stoi、stof 和 family 是否是多余的?

c++ - 巨大的静态数组与函数内的局部数组

复数 (complex.h) 和明显的精度滞后

c++ - 为新的 ArrayFire 版本调整 MatchedFilter 算法时出现问题