cuda中用cublas库做矩阵乘法
这里矩阵C=A*B,原始文档给的公式是C=alpha*A*B+beta*C,所以这里alpha=1,beta=0。
主要使用cublasSgemm这个函数,这个函数的第二个参数有三种类型,这里CUBLAS_OP_N求出来矩阵结果是按行排列,所以不需要转置了。
如果用CUBLAS_OP_T参数求得的结果是按列排列,做成C形式的矩阵应该还需要转置一下,并且后面跟的参数也不太一样,这个参数我就没再尝试了。
代码如下:
#include "cuda_runtime.h"
#include "cublas_v2.h" #include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <ctime> using namespace std; int main()
{
srand(time());
int M = ; //矩阵A的行,矩阵C的行
int N = ; //矩阵A的列,矩阵B的行
int K = ; //矩阵B的列,矩阵C的列 float *h_A = (float*)malloc(sizeof(float)*M*N);
float *h_B = (float*)malloc(sizeof(float)*N*K);
float *h_C = (float*)malloc(sizeof(float)*M*K); for (int i = ; i < M*N; i++)
{
h_A[i] = rand() % ;
cout << h_A[i] << " ";
if ((i + ) % N == )
cout << endl;
}
cout << endl; for (int i = ; i < N*K; i++)
{
h_B[i] = rand() % ;
cout << h_B[i] << " ";
if ((i + ) % K == )
cout << endl;
}
cout << endl; float *d_A, *d_B, *d_C,*d_CT;
cudaMalloc((void**)&d_A, sizeof(float)*M*N);
cudaMalloc((void**)&d_B, sizeof(float)*N*K);
cudaMalloc((void**)&d_C, sizeof(float)*M*K); cudaMemcpy(d_A, h_A, M*N * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_B, h_B, N*K * sizeof(float), cudaMemcpyHostToDevice); float alpha = ;
float beta = ; //C=A*B
cublasHandle_t handle;
cublasCreate(&handle);
cublasSgemm(handle,
CUBLAS_OP_N,
CUBLAS_OP_N,
K, //矩阵B的列数
M, //矩阵A的行数
N, //矩阵A的列数
&alpha,
d_B,
K,
d_A,
N,
&beta,
d_C,
K); cudaMemcpy(h_C, d_C, M*K * sizeof(float), cudaMemcpyDeviceToHost); for (int i = ; i < M*K; i++)
{
cout << h_C[i] << " ";
if ((i+)%K==)
cout << endl;
} cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
free(h_A);
free(h_B);
free(h_C);
return ;
}
结果:
cuda中用cublas库做矩阵乘法的更多相关文章
- 有关CUBLAS中的矩阵乘法函数
关于cuBLAS库中矩阵乘法相关的函数及其输入输出进行详细讨论. ▶ 涨姿势: ● cuBLAS中能用于运算矩阵乘法的函数有4个,分别是 cublasSgemm(单精度实数).cublasDgemm( ...
- 【神经网络与深度学习】【C/C++】使用blas做矩阵乘法
使用blas做矩阵乘法 #define min(x,y) (((x) < (y)) ? (x) : (y)) #include <stdio.h> #include <st ...
- numpy.loadtxt() 出现codecError_____ Excel 做矩阵乘法
1) 用 numpy读入csv文件是报错 UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal m ...
- 使用blas做矩阵乘法
#define min(x,y) (((x) < (y)) ? (x) : (y)) #include <stdio.h> #include <stdlib.h> # ...
- 使用 CUBLAS 库给矩阵运算提速
前言 编写 CUDA 程序真心不是个简单的事儿,调试也不方便,很费时.那么有没有一些现成的 CUDA 库来调用呢? 答案是有的,如 CUBLAS 就是 CUDA 专门用来解决线性代数运算的库. 本文将 ...
- 第四篇:使用 CUBLAS 库给矩阵运算提速
前言 编写 CUDA 程序真心不是个简单的事儿,调试也不方便,很费时.那么有没有一些现成的 CUDA 库来调用呢? 答案是有的,如 CUBLAS 就是 CUDA 专门用来解决线性代数运算的库. 本文将 ...
- POJ 2778 DNA Sequence (AC自动机,矩阵乘法)
题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种. 思路:用AC自动机,利用AC自动机上的节点做矩阵乘法. #include<iostream> #includ ...
- poj3233之经典矩阵乘法
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 12346 Accepted: ...
- 51nod 1462 树据结构 | 树链剖分 矩阵乘法
题目链接 51nod 1462 题目描述 给一颗以1为根的树. 每个点有两个权值:vi, ti,一开始全部是零. Q次操作: 读入o, u, d o = 1 对u到根上所有点的vi += d o = ...
随机推荐
- vtk文件编写
在paraview中加载vtk文件,可以很好的显示三维空间图像,如下cpp代码: #include <iostream> #include <fstream> #include ...
- 一对一Socket简单聊天的实现
今天终于调试通了Socket一对一的聊天,每次发送连接请求后,将用户名发送到Socket中去,然后将用户名和新建的socket存到map中,然后根据用户名来确定接收方是谁,以实现一对一的聊天功能. 上 ...
- spring boot 与 thymeleaf (1): 国际化
在thymeleaf 里面有个消息表达式: #{...} , 可以借此来实现国际化. 在我使用这个功能的时候, 碰到了一个问题, 按照 JavaEE开发的颠覆者 Spring Boot实战 上面编码 ...
- 微信小程序——豆瓣电影——(2):小程序运行部署
Demo 预览 演示视频(流量预警 2.64MB) GitHub Repo 地址 仓库地址:https://github.com/zce/weapp-demo 使用步骤 将仓库克隆到本地: bash ...
- mysql 获取自增主键
MyBatis 3.2.6插入时候获取自增主键方法有二 以MySQL5.5为例: 方法1: <insert id="insert" parameterType="P ...
- (转)mybatis数据库物理分页插件PageHelper
以前使用ibatis/mybatis,都是自己手写sql语句进行物理分页,虽然稍微有点麻烦,但是都习惯了.最近试用了下mybatis的分页插件 PageHelper,感觉还不错吧.记录下其使用方法. ...
- 长沙.NET社区之光
奈何万事开头难 迎着改革开放四十年带来的春风,长沙的互联网生态环境以唐胡子俱乐部为首的一众互联网社群讲长沙互联网的环境推上了一个新的台阶.年底,我与有幸一起共事的溪源兄,下班后一起闲聊,觉着长沙的.N ...
- 爬虫---selenium动态网页数据抓取
动态网页数据抓取 什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页 ...
- Net is as typeof 运行运算符详解
概述 在了解运行运算符的前提我们需要了解什么是RTTI ,在任何一门面向对象的语言中,都有RTTI这个概念(即 运行时). RTTI(Run-Time Type Identification),通过运 ...
- thinkphp save() 跟新失败
一.失败案例 $data = I(); $rs = $this->typeModel->data($data)->save(); 二.正确案例 正确一 $rs=$this->t ...