簡體   English   中英

如何在GPU上執行基本操作(+-* /)並在其上存儲結果

[英]How to perform basic operations (+ - * /) on GPU and store the result on it

我有以下代碼行, gamma是一個CPU變量,在我需要復制到GPU之后。 gamma_xdelta也存儲在CPU中。 有什么方法可以執行以下行並將其結果直接存儲在GPU上? 因此,基本上,在GPU上托管gammagamma_xdelta ,並在GPU上獲取以下行的輸出。 之后的代碼行將大大加快我的代碼的速度。 我嘗試使用magma_dcopy但到目前為止,我找不到使它工作的方法,因為magma_ddot的輸出是CPU的兩倍。

gamma = -(gamma_x[i+1] + magma_ddot(i,&d_gamma_x[1],1,&(d_l2)[1],1, queue))/delta;

簡短的答案是不,您不能這樣做,或者至少在使用magma_ddot不能這樣做。

然而, magma_ddot是圍繞自身僅非常薄的包裝cublasDdot和CUBLAS功能完全支持具有存儲在GPU存儲器,而不是返回到主機的操作的結果。

理論上講,您可以執行以下操作:

// before the apparent loop you have not shown us:
double* dotresult;
cudaMalloc(&dotresult, sizeof(double));

for (int i=....) { 
    // ...

    // magma_ddot(i,&d_gamma_x[1],1,&(d_l2)[1],1, queue);
    cublasSetPointerMode( queue->cublas_handle(), CUBLAS_POINTER_MODE_DEVICE);
    cublasDdot(queue->cublas_handle(), i, &d_gamma_x[1], 1, &(d_l2)[1], 1, &dotresult);
    cudaDeviceSynchronize();
    cublasSetPointerMode( queue->cublas_handle(), CUBLAS_POINTER_MODE_HOST);

    // Now dotresult holds the magma_ddot result in device memory

    // ...

}

請注意,這可能會使Magma崩潰,具體取決於您的使用方式,因為Magma在內部使用CUBLAS,並且在Magma內部如何處理CUBLAS狀態和異步操作完全沒有記錄。 話雖如此,如果您小心一點,應該可以。

為了執行計算,可以編寫一個非常簡單的內核並使用一個線程啟動它,或者根據您的喜好使用帶有lambda表達式的簡單推力調用。 我把它留給讀者練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM