我想用ArrayFire
替换以前用armadillo
编写的一些计算,以便使用一些GPU功能。我不想替换所有东西,只是时间紧迫的地方。因此,我需要将armadillo
结构转换为arrayfire
结构并返回。第一步很简单:
arma::colvec A_arma(5, arma::fill::ones);
af::array A_array(5, A_arma.memptr());//Done
回去更难。如何将数据从arrayfire
结构获取到armadillo
结构中?我可以遍历所有元素并将它们写入armadillo
结构中,但这需要很多时间。有没有更简单的方法?
主机成员函数将数据从af::array
中复制出来。例如,您可以将数据从 ArrayFire 数组复制到如下所示的std::vector
:
af::array gpu_data = af::randu(10, 10);
vector<float> cpu_data(gpu_data.elements());
gpu_data.host<float>(cpu_data.data());
这会将列主顺序中的数据复制到cpu_data
向量。
我对犰狳的数据结构不太熟悉,但我相信您可以将memptr
返回的指针传递给主机函数,数据将被复制到其中。
您可以使用ArrayFire数组的host
指针直接转换为犰狳结构。
size_t nrows = 10;
size_t ncols = 10;
af::array af = af::constant(0, nrows, ncols); // defaults to dtype=f32
float* host_ptr = af.host<double>();
arma::fmat arma(host_ptr, nrows, ncols);
请注意,类型和大小需要匹配。在上述情况下,使用了单精度浮点类型。对于双精度,您必须更改为以下内容。
af::array af = af::constant(0, nrows, ncols, f64); // specify dtype=f64
double* host_ptr = af.host<double>();
arma::mat arma(host_ptr, nrows, ncols);
对于复杂的向量,它有点复杂。犰狳使用std::complex
而ArrayFire在引擎盖下使用不同的数据结构。这些应该是兼容的(验证您的系统(,因此使用reinterpret_cast
应该可以解决问题。
af::cfloat* host_ptr = img_af.host<af::cfloat>(); // Assuming dtype=c32
arma::cx_fmat arma(reinterpret_cast<std::complex<float>*>(host_ptr), nrows, ncols);
最后但并非最不重要的一点是,请务必释放主机指针,否则您将出现内存泄漏!
af::freeHost(host_ptr);