我如何从一个方法返回一个Eigen :: Matrix,这样它在返回时不会复制数据

时间:2013-03-11 01:37:30

标签: eigen

我有:

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()

函数调用的rhs

2 个答案:

答案 0 :(得分:10)

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

请注意,它只能执行此操作,因为它可以看到mat将始终是返回值,如果方法中有多个矩阵,并且一个基于某些条件返回,编译器不知道哪一个用隐藏的指针参数替换。在这种情况下,您必须手动执行此操作,例如在alrikai的回答中。

要启用优化,您必须使用GCC -O2进行编译。

答案 1 :(得分:3)

我没有多使用Eigen,但你不能将你的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);
}