首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据从arrayfire阵列传输到arrayfire阵列到arrayfire结构

将数据从arrayfire阵列传输到arrayfire阵列到arrayfire结构
EN

Stack Overflow用户
提问于 2018-04-06 12:09:20
回答 2查看 720关注 0票数 3

为了使用一些GPU功能,我想将以前用armadillo编写的一些计算替换为ArrayFire。我不想取代一切,只是时间上的关键点.因此,我需要将armadillo-structures转换为arrayfire-structures并返回。第一步很简单:

代码语言:javascript
复制
arma::colvec A_arma(5, arma::fill::ones);
af::array A_array(5, A_arma.memptr());//Done

回去更难。如何将arrayfire-structure中的数据导入armadillo-structure?我可以迭代所有元素,并将它们写入armadillo结构中,但这需要很长时间。有没有更简单的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-07 16:34:05

您可以使用af::array成员函数从主机中复制数据。例如,可以将数据从ArrayFire数组复制到std::vector中,如下所示:

代码语言:javascript
复制
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返回的指针传递给主机函数,并将数据复制到其中。

票数 3
EN

Stack Overflow用户

发布于 2021-01-12 15:42:51

您可以使用ArrayFire数组的host指针直接转换为Armadillo结构。

代码语言:javascript
复制
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);

注意,类型和大小需要匹配。在上述情况下,采用单精度浮点类型。要获得双重精度,您必须更改为以下内容。

代码语言:javascript
复制
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应该可以做到这一点。

代码语言:javascript
复制
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);

最后但并非最不重要的,一定要释放主机指针,否则您将有一个内存泄漏!

代码语言:javascript
复制
af::freeHost(host_ptr);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49692531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档