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>());
我只想 "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>());