6

我有:

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

是否有可能让它将数据写入矩阵,这是函数调用的 rhsload_from_gpu()

4

2 回答 2

11

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

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

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

于 2013-03-20T16:09:17.193 回答
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);
}
于 2013-03-11T01:45:44.480 回答