[英]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.