为了使用一些GPU功能,我想将以前用armadillo编写的一些计算替换为ArrayFire。我不想取代一切,只是时间上的关键点.因此,我需要将armadillo-structures转换为arrayfire-structures并返回。第一步很简单:
arma::colvec A_arma(5, arma::fill::ones);
af::array A_array(5, A_arma.memptr());//Done回去更难。如何将arrayfire-structure中的数据导入armadillo-structure?我可以迭代所有元素,并将它们写入armadillo结构中,但这需要很长时间。有没有更简单的方法?
发布于 2018-04-07 16:34:05
您可以使用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向量。
我不太熟悉armadillo的数据结构,但我相信您可以将memptr返回的指针传递给主机函数,并将数据复制到其中。
发布于 2021-01-12 15:42:51
您可以使用ArrayFire数组的host指针直接转换为Armadillo结构。
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);对于复向量来说,则要复杂一些。Armadillo使用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);https://stackoverflow.com/questions/49692531
复制相似问题