gpt4 book ai didi

cuda - 使用 CUBLAS 例程在 GPGPU 上保留点积

转载 作者:行者123 更新时间:2023-11-30 17:25:45 24 4
gpt4 key购买 nike

我正在编写一段代码,使用点积的 CUBLAS 例程来计算两个向量的点积,但它返回主机内存中的值。我想仅使用点积在 GPGPU 上进行进一步计算。如何使该值仅驻留在 GPGPU 上并将其用于进一步计算,而不需要从 CPU 显式复制到 GPGPU?

最佳答案

只要您使用“V2”API,您就可以在 CUBLAS 中执行此操作。较新的 API 包含一个函数 cublasSetPointerMode您可以使用它来设置 API,以假设所有返回标量值的例程都将传递设备指针而不是主机指针。最新 CUBLAS 文档的第 2.4 节对此进行了讨论。例如:

#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <stdio.h>

int main(void)
{
const int nvals = 10;
const size_t sz = sizeof(double) * (size_t)nvals;
double x[nvals], y[nvals];
double *x_, *y_, *result_;
double result=0., resulth=0.;

for(int i=0; i<nvals; i++) {
x[i] = y[i] = (double)(i)/(double)(nvals);
resulth += x[i] * y[i];
}

cublasHandle_t h;
cublasCreate(&h);
cublasSetPointerMode(h, CUBLAS_POINTER_MODE_DEVICE);

cudaMalloc( (void **)(&x_), sz);
cudaMalloc( (void **)(&y_), sz);
cudaMalloc( (void **)(&result_), sizeof(double) );

cudaMemcpy(x_, x, sz, cudaMemcpyHostToDevice);
cudaMemcpy(y_, y, sz, cudaMemcpyHostToDevice);

cublasDdot(h, nvals, x_, 1, y_, 1, result_);

cudaMemcpy(&result, result_, sizeof(double), cudaMemcpyDeviceToHost);

printf("%f %f\n", resulth, result);

cublasDestroy(h);
return 0;
}

使用CUBLAS_POINTER_MODE_DEVICE使cublasDdot假设result_是一个设备指针,并且没有尝试将结果复制回主机。请注意,这会生成类似 dot 的例程。异步,因此您可能需要密切关注设备和主机之间的同步。

关于cuda - 使用 CUBLAS 例程在 GPGPU 上保留点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26993405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com