af :: array :: device не работает со сложными массивами - PullRequest
0 голосов
/ 15 октября 2019

Я просто хочу "использовать" сложный массив af :: для ядра Cuda. К сожалению, преобразование, которое описано в документации af (http://arrayfire.org/docs/interop_cuda.htm) здесь не работает:

#include <arrayfire.h>
#include <af/cuda.h>
#include <thrust/complex.h>
#include <cuComplex.h>
using namespace af;


typedef thrust::complex<double> D2;

void test(){
    randomEngine en =  randomEngine(); 
    dim4 dims(4, 4);
    array a = randn(dims, c64, en); // array a = randn(dims, f64, en);
    a.eval();
    D2 *d_A = a.device<D2>(); // double *d_A = a.device<double>(); --------error line----------
    a.unlock();
}


int main(){
    test();
    return 0;
}

Когда я пытался построить это, я получил эту ошибку: /usr/bin/ld: CMakeFiles/test.dir/comp.cu.o: in function `test()': tmpxft_00003e39_00000000-5_comp.cudafe1.cpp:(.text+0x2e6): undefined reference to `thrust::complex<double>* af::array::device<thrust::complex<double> >() const'

Работает с обычными двойниками. Моя Cuda-версия V10.1.105. Моя ОС - Ubuntu 19.04. Спасибо за помощь!

1 Ответ

1 голос
/ 15 октября 2019

У нас нет API, который принимает тип thrust::complex<T>, так как это потребовало бы, чтобы мы включали сторонние заголовки в наш заголовок, что не является обязательным для всех случаев использования.

Это не означаетВы не можете использовать комплексные числа, хотя. Любое представление комплексного числа, которое совместимо с ABI с тем, что мы определили (af::cfloat & af::cdouble) в af/complex.h, может быть передано нашему API.

Сказав это, я лично не знаю, толкнул ли:: Complex это простой POD или нет. Предполагая, что это так, вы должны быть в состоянии сделать следующее:

D2 *d_A = reinterpret_cast<D2*>(a.device<af::cdouble>());
...