VS2015+cublas实操记录(cuda加速GEMM矩阵乘加算子)

这篇具有很好参考价值的文章主要介绍了VS2015+cublas实操记录(cuda加速GEMM矩阵乘加算子)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 环境配置:

cuda安装后一般的安装位置在:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8
把这个目录下的include和lib分别配置在vs中,安装cuda教程可参考:https://zhuanlan.zhihu.com/p/520995962(笔者实操ok版本:win11+cuda11.8+cdunn8.2.1.32+trt8.5.3.1)。
VS2015+cublas实操记录(cuda加速GEMM矩阵乘加算子),深度学习,矩阵,线性代数,cuda,cublas,gemm
另外还要记得添加附加依赖项

cublas.lib
cudart.lib

VS2015+cublas实操记录(cuda加速GEMM矩阵乘加算子),深度学习,矩阵,线性代数,cuda,cublas,gemm
不然会报错:
error LNK2019: 无法解析的外部符号 cudaMalloc,该符号在函数 “class cv::Mat __cdecl CublasByCuda(class cv::Mat,class cv::Mat)” (?CublasByCuda@@YA?AVMat@cv@@V12@0@Z) 中被引用
VS2015+cublas实操记录(cuda加速GEMM矩阵乘加算子),深度学习,矩阵,线性代数,cuda,cublas,gemm

2. 代码可参考:

https://blog.csdn.net/baishuiniyaonulia/article/details/120119380文章来源地址https://www.toymoban.com/news/detail-644557.html

  • 如果你是结合opencv,用cv::Mat做矩阵乘可参考:
#include <iostream>
#include <opencv2/core.hpp>
#include <cuda_runtime.h>
#include <cublas_v2.h>

int main() {
    const int N = 1000;
    const int K = 500;
    const int M = 800;

    // 创建 cuBLAS 句柄
    cublasHandle_t cublasHandle;
    cublasCreate(&cublasHandle);

    // 分配设备内存
    float *d_A, *d_B, *d_C;
    cudaMalloc((void**)&d_A, N * K * sizeof(float));
    cudaMalloc((void**)&d_B, K * M * sizeof(float));
    cudaMalloc((void**)&d_C, N * M * sizeof(float));

    // 在这里可以将数据填充到 d_A 和 d_B
    // 例如,将 cv::Mat 转换为设备内存中的数据
    cv::Mat A(N, K, CV_32F);
    cv::Mat B(K, M, CV_32F);
    cv::randu(A, 0.0, 1.0);
    cv::randu(B, 0.0, 1.0);
    cudaMemcpy(d_A, A.data, N * K * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(d_B, B.data, K * M * sizeof(float), cudaMemcpyHostToDevice);

    const float alpha = 1.0f;
    const float beta = 0.0f;

    // 调用 cuBLAS 进行矩阵乘法计算
    cublasSgemm(cublasHandle, CUBLAS_OP_N, CUBLAS_OP_N,
                M, N, K,
                &alpha, d_B, M,
                d_A, K,
                &beta, d_C, M);

    // 将结果从设备内存传回主机内存
    cv::Mat C(N, M, CV_32F);
    cudaMemcpy(C.data, d_C, N * M * sizeof(float), cudaMemcpyDeviceToHost);

    // 打印计算结果
    std::cout << "Result Matrix C:" << std::endl << C << std::endl;

    // 清理资源
    cublasDestroy(cublasHandle);
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);

    return 0;
}

到了这里,关于VS2015+cublas实操记录(cuda加速GEMM矩阵乘加算子)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling `cublas‘

    调用nn.linear时出现RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling `cublas’错误 ,搜索网上资料,主要指出以下原因: batch size太大(本人将batchsize设置成4,够小吧!还是不行。。。) CUDA版本和torch不匹配(本人cuda版本是10.1,pytorch版本安装的是cuda10.1+python3.8的pytorch1.

    2023年04月08日
    浏览(42)
  • AI训练环境-CUDA/cuDNN/paddle ——‘CUBLAS_STATUS_INVALID_VALUE‘.

    @TOC运行报错 ‘CUBLAS_STATUS_INVALID_VALUE’. An unsupported value or parameter was passed to the function (a negative vector size, for example). To correct: ensure that all the parameters being passed have valid values. ] 使用 Paddle 深度学习平台运行相关程序时,报错信息如下: OSError: (External) CUBLAS error(7). [Hint: ‘CUBLAS

    2024年02月14日
    浏览(38)
  • 通用矩阵乘(GEMM)优化与卷积计算

    黎明灰烬 博客 技术 杂谈 标签 关于 通用矩阵乘(GEMM)优化算法 黎明灰烬 • 2019-06-12 | 知乎 | 幻灯片 | 点击查看目录 引言 气象预报、石油勘探、核子物理等现代科学技术大多依赖计算机的计算模拟,模拟计算的核心是表示状态转移的矩阵计算。另一方面,计算机图形处理以

    2024年02月03日
    浏览(43)
  • 使用cublas实现矩阵乘法

    使用CUDA写一个矩阵乘法 C = A X B (矩阵维度: A: M X K, B: K X N, C: M X N ),当然可以自己写核函数,但效率不如CUDA自带的 cublas 算法效率高。使用 cublas 唯一值得注意的地方是, 在CPU中的矩阵数据存储是行优先存储,而在GPU中是列优先存储 ,这相当于对原矩阵做了一次转置,我

    2024年02月16日
    浏览(44)
  • 矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵

     论文自然还是 Anatomy of High-Performance Matrix Multiplication。 如何拆分 一个矩阵乘法有 6 种拆分方式,其中对 row-major 效率最高的是: 第一次拆分 先做第一次拆分,取 A 的 kc 列(PanelA)和 B 的 kc 行(PanelB),得到待累加的一部分结果; 第二次拆分 第二次拆分,把 PanelB 按 nc 大

    2024年04月27日
    浏览(39)
  • RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling `cublasCreate(handle)`

    DialoGPT/data_loader.py at 457835e7d8acd08acf7f6f0e980f36fd327ea37c · microsoft/DialoGPT · GitHub 报错:RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling `cublasCreate(handle)` 我把输入用同样形状的随机张量进行了测试,发现用随机的整数张量可以,但是用我的输入就不行,于是想看看两者的区别

    2024年02月11日
    浏览(118)
  • 【报错】RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasLtMatmul( ltHandle,

    在GPU上运行hugging face transformer的时候出现如下报错: 切换至cpu之后,报错: 根据cpu上的报错内容,判断为 模型输入太长 ,超过了模型的embedding最大尺寸,可以在tokenizer设置 max_len 来进行截断( truncation )。 由于GPU上的报错一般都比较抽象, 建议先在cpu上debug 。有可能你的

    2024年02月14日
    浏览(50)
  • cutlass入门: 调用cutlass做通用矩阵乘法Gemm(附代码)

    cutlass是CUDA C++模板抽象的集合,用于实现CUDA中所有级别和规模的高性能矩阵乘法(GEMM)和相关计算。相较于cuBLAS和cuDNN,cutlass中包含了更多可重用的模块化软件组件,这使得cutlass相较于前两者更为灵活。 cutlass项目官方网站:GitHub - NVIDIA/cutlass: CUDA Templates for Linear Algebra Su

    2024年02月12日
    浏览(131)
  • VS2022编译运行VS2015的项目

        最近新装了VisualStudio2022,有一些VS2015老的项目需要运行,但不想再安装VS2015,就想能否直接在VS2022编译运行,研究一下发现可行,记录一下。 1. 直接升级VS2015项目到2022使用windows sdk 10.0     发现老代码里的一些语法已经不支持,改动会很大,此路不通。 2. 保持VS2015项目

    2024年02月12日
    浏览(48)
  • vs2015、vs2017、vs2019、msvc自动编译脚本

    rem 记录编译时间 echo ** 版本构建开始时间: %date% %time% build.log rem 设置编译器进程名 set DstProgram=devenv.exe rem 搜索目标进程以及其目录 echo 正在搜索\\\"%DstProgram%“, 请稍候… for %%a in (“C:Program Files (x86)”, “C:Program Files”, “D:Program Files (x86)”, “D:Program Files”) do for /f “delim

    2024年02月06日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包