来自复杂主机数据的阵列火力阵列

Arrayfire array from complex host data

本文关键字:阵列 数据 复杂 主机      更新时间:2023-10-16

我在从主机数据初始化 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::复杂的主机数据初始化数组?

感谢您的帮助

这有点类似于问题af::array::d evice 不适用于复杂数组,请查看 - 唯一的区别是复杂数据的传递方向。

以下内容应该可以正常工作,因为std::complex应该与 ABI 兼容af::cfloat

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

ArrayFire API 不会有float2类型的函数符号,但它将有类型为af::cfloat的函数符号。我认为,即使是cuFloatComplextfloat2也应该与 ABI 兼容af::cfloat。因此,重新解释-投射到af::cfloat是应该做的。