2013-03-11 91 views
4

当这样它不复制数据我有:如何从一个方法返回一个征::矩阵返回

Eigen::MatrixXf load_from_gpu() 
{ 
    Eigen::MatrixXf mat(m_rows,m_cols); 
    clEnqueueReadBuffer(m_manager->m_gpu_queue_loader, m_buffer, CL_TRUE, 0, sizeof(float)*numel(), mat.data(), 0, NULL, NULL); 
    return mat; 
} 

我相信,当我把这种方法将数据存储到一个垫子然后拷入到MAT2:Eigen::MatrixXf mat2 = load_from_gpu();

是否有可能使其将数据写入这是我没有用太多的本征的load_from_gpu()

回答

10

您的编译器应该能够使用常见的Return Value Optimization方法为您执行此操作。基本上,它的作用是编译器重写load_from_gpu以指向Eigen::MatrixXf作为参数,并直接填充该矩阵。

请注意,它只能这样做,因为它可以看到mat将始终是返回值,如果方法中有几个矩阵并且基于某些条件返回一个矩阵,编译器不知道哪一个用隐藏的指针参数替换。在这种情况下,你必须采取手动方式,就像在alrikai的答案中一样。

要启用优化,您必须使用GCC编译为-O2

3

函数调用的RHS矩阵,但你无法通过Matrix作为参考参数并将其分配到load_from_gpu()?也就是,

void load_from_gpu(Eigen::MatrixXf& mat) 
{ 
    clEnqueueReadBuffer(m_manager->m_gpu_queue_loader, m_buffer, CL_TRUE, 0, sizeof(float)*numel(), mat.data(), 0, NULL, NULL); 
} 
+0

这是我的选择,如果我不能得到其他的东西工作。 – 2013-03-11 01:53:31

+0

你还有什么想法? – alrikai 2013-03-11 03:41:57

+0

我希望它被函数返回而不是作为参数。 – 2013-03-11 09:35:34