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

Pou*_*sen 4 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; 
}
Run Code Online (Sandbox Code Playgroud)

我相信当我调用此方法时,数据会存储到一个垫子然后复制到mat2: Eigen::MatrixXf mat2 = load_from_gpu();

是否可以将数据写入矩阵,该矩阵是函数调用的rhs load_from_gpu()

sgv*_*gvd 10

您的编译器应该能够使用常见的返回值优化方法为您执行此操作.基本上它的作用是编译器重写load_from_gpu以将指针Eigen::MatrixXf作为参数,并直接填充该矩阵.

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

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