3

我想用 替换我以前用 编写的一些计算armadilloArrayFire以便使用一些 GPU 功能。我不想替换所有东西,只替换时间关键点。因此,我需要将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结构,但这会花费很多时间。有没有更简单的方法?

4

2 回答 2

3

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给主机函数,数据将被复制到其中。

于 2018-04-07T16:34:05.837 回答
0

您可以使用 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 在底层使用不同的数据结构。这些应该是兼容的(验证您的系统),因此使用 areinterpret_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);
于 2021-01-12T15:42:51.850 回答