[英]How to perform basic operations (+ - * /) on GPU and store the result on it
我有以下代碼行, gamma
是一個CPU變量,在我需要復制到GPU之后。 gamma_x
和delta
也存儲在CPU中。 有什么方法可以執行以下行並將其結果直接存儲在GPU上? 因此,基本上,在GPU上托管gamma
, gamma_x
和delta
,並在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.