我有:
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()
答案 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);
}