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; 
}

このメソッドを呼び出すと、データは1つのマットに保存されてから、mat2にコピーされると思います。Eigen::MatrixXf mat2 = load_from_gpu();

の関数呼び出しのrhsである行列にデータを書き込むようにすることは可能ですか?load_from_gpu()

4

2 に答える 2

11

コンパイラは、一般的な戻り値の最適化メソッドを使用して、これを実行できるはずです。基本的にこれが行うことは、コンパイラーがパラメーターとしてload_from_gpuへのポインターを取り、その行列を直接埋めるように書き直すことです。Eigen::MatrixXf

これができるのは、それが常に戻り値であることがわかるためだけであることに注意してくださいmat。メソッドに複数の行列があり、ある条件に基づいて1つが返される場合、コンパイラはどれを非表示のポインタに置き換えるかを認識しません。パラメータ。この場合、alrikaiの回答のように、手動で行う必要があります。

最適化を有効にするには-O2、GCCでコンパイルする必要があります。

于 2013-03-20T16:09:17.193 に答える
3

私はEigenをあまり使用していませんが、マトリックスを参照パラメーターとして渡して、に割り当てることはできません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 に答える