我在从主机数据初始化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兼容。因此,应将重新解释广播到af::cfloat

10-08 09:24