首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CUBLAS程序在GPGPU上保留点积

用CUBLAS程序在GPGPU上保留点积
EN

Stack Overflow用户
提问于 2012-09-13 14:18:16
回答 1查看 3.9K关注 0票数 4

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

EN

回答 1

Stack Overflow用户

发布于 2012-09-13 15:57:32

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

代码语言:javascript
复制
#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这样的例程是异步的,因此您可能需要关注设备和主机之间的同步。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12400477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档