af::array::device 不适用于复杂数组

af::array::device doesn't work with complex arrays

我只想 "use" 一个复杂的 af::array 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。我的 OS 是 Ubuntu 19.04。 感谢您的帮助!

我们没有接受 thrust::complex<T> 类型的 API,因为这需要我们在 header 中包含 third-party header,即不是所有用例的要求。

但这并不意味着您不能使用复数。任何与我们在 af/complex.h 中定义的 (af::cfloat & af::cdouble) 兼容的 ABI 复数表示都可以传递给我们的 API.

话虽如此,我个人不知道thrust::complex是不是一个简单的POD。假设是,您应该能够执行以下操作:

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