将数据从阵列火阵列传输到犰狳结构



我想用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);

相关内容

  • 没有找到相关文章

最新更新