Массив 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 дает точно такую ​​​​же ошибку, поскольку это одно и то же).

Я чувствую, что делаю здесь глупую ошибку, но не могу понять, в чем дело.

Как я должен инициализировать массив arrayfire из данных хоста std::complex?

Спасибо за помощь


person AAG    schedule 20.12.2019    source источник


Ответы (1)


Это похоже на вопрос af::array::device не работает с сложные массивы, пожалуйста, посмотрите - единственная разница заключается в направлении, в котором передаются сложные данные.

Следующее должно работать нормально, так как 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. Я думаю, что даже cuFloatComplext или float2 также должны быть совместимы с ABI с af::cfloat. Итак, переинтерпретировать-приведение к af::cfloat - это то, что нужно сделать.

person pradeep    schedule 21.12.2019