CUDA学习(七):CUBLAS库实现向量加法

文章目录

    • 一、CUBLAS(V2)库的主要流程

说起CUDA,不得不提NVIDIA巨资打造的CUDA库,CUDA函数库可以看做GPU程序的优化极限。
针对向量加法,CUBLAS库函数中cublasaxpy()函数可以实现向量加法功能,在float的前提下,可以用cublasSaxpy()函数。
本节主要学习了cublas库的调用方法:
包括代码上的主要流程以及CMakeList.txt链接库。

一、CUBLAS(V2)库的主要流程

1、引用头文件cublas_v2.h
2、利用cublasHandle_t申明句柄
3、利用cublasCreate()函数创建句柄
4、利用cublasSetVector()函数实现(host to Device)数据传输
5、利用cublasSaxvpy_v2()函数实现向量加法运算
6、通过cublasFetVector() 函数实现(Device to host)运算
7、用cublasDestory()函数销毁句柄

#include 
#include "cublas_v2.h"

#define  N 10
int main() {
    float a[N], b[N], c[N];
    float *dev_a, *dev_b, *dev_c;
    for(int i=0; i<N; ++i) // 为数组a、b赋值
    {
        float tmp = 1.0 * i;
        a[i] = tmp;
        b[i] = tmp * tmp;
    }

    cublasHandle_t handle;  // 申明句柄
    cublasCreate_v2(&handle); // 创建句柄
    cudaMalloc(&dev_a, sizeof(float) * N);
    cudaMalloc(&dev_b, sizeof(float) * N);
//
    float alpha = 1.0;
    cublasSetVector(N, sizeof(float), a, 1, dev_a, 1); // H2D host to device
    cublasSetVector(N, sizeof(float), b, 1, dev_b, 1);
    cublasSaxpy_v2(handle, N, &alpha, dev_a, 1, dev_b, 1); //实现向量+
    cublasGetVector(N, sizeof(float), dev_b, 1, c, 1); // D2H
    cudaFree(dev_a);
    cudaFree(dev_b);
    cublasDestroy(handle); // 销毁句柄

    for(int i=0; i<N; ++i)
    {
        printf("%f + %f * %f = %f \n", a[i], b[i],b[i], c[i]);
    }
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

cmakeList.txt内容如下
编译的时候,还需要把libcublas.so文件添加进来

cmake_minimum_required(VERSION 3.14)
project(1_4_vectorAddWithBlas)

set(CMAKE_CXX_STANDARD 14)

find_package(CUDA REQUIRED)
link_directories("/usr/local/cuda-10.0/lib64") # libcublas.so 所在文件夹路径

cuda_add_executable(1_4_vectorAddWithBlas main.cu)
target_link_libraries(1_4_vectorAddWithBlas cublas) # 链接库

你可能感兴趣的:(编程语言,CUDA入门)