cblas_sgemm

        int m = 40;
int k = 20;
int n = 40;
std::vector<float> a(m*k, 1.0);
std::vector<float> b(k*n, 1.0);
std::vector<float> c(m*n, 0.0); float alpha = 1.0;
float beta = 0.0;
cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
m, n, k, alpha,
a.data(), k,
b.data(), n, beta,
c.data(), n); std::cout << "a.size(): " << a.size() << std::endl;
for (int i = 0; i < a.size(); ++i) {
std::cout << a[i] << " ";
if ((i + 1) % k == 0)
std::cout << std::endl;
} std::cout << "b.size(): " << b.size() << std::endl;
for (int i = 0; i < b.size(); ++i) {
std::cout << b[i] << " ";
if ((i + 1) % n == 0)
std::cout << std::endl;
} std::cout << "c.size(): " << c.size() << std::endl;
for (int i = 0; i < c.size(); ++i) {
std::cout << c[i] << " ";
if ((i + 1) % n == 0)
std::cout << std::endl;
}
std::cout << std::endl;

output:

a.size(): 800 ( 40 * 20 )
1 1 ... 1 1
...
1 1 ... 1 1
b.size(): 800 ( 20 * 40 )
1 1 ... 1 1
...
1 1 ... 1 1
c_array.size(): 1600 (40 * 40)
20 20 ... 20 20
...
20 20 ... 20 20

cblas_sgemm_batch



        int raw_rows = 20;
int raw_cols = 40;
std::vector<float> a(raw_rows * raw_cols, 1.0);
std::vector<float> b(raw_rows * raw_cols, 1.0);
std::vector<float> c(1600, 0.0); #define GRP_COUNT 1
MKL_INT m[GRP_COUNT] = {20};
MKL_INT k[GRP_COUNT] = {10};
MKL_INT n[GRP_COUNT] = {20}; MKL_INT lda[GRP_COUNT] = {40};
MKL_INT ldb[GRP_COUNT] = {40};
MKL_INT ldc[GRP_COUNT] = {80}; CBLAS_TRANSPOSE transA[GRP_COUNT] = { CblasNoTrans };
CBLAS_TRANSPOSE transB[GRP_COUNT] = { CblasTrans }; float alpha[GRP_COUNT] = {1.0};
float beta[GRP_COUNT] = {0.0}; const MKL_INT size_per_grp[GRP_COUNT] = {4}; const float *a_array[4], *b_array[4];
float *c_array[4];
for (int i = 0; i < 4; ++i) {
a_array[i] = a.data() + i * 10;
b_array[i] = b.data() + i * 10;
c_array[i] = c.data() + i * 20;
} cblas_sgemm_batch (CblasRowMajor, transA, transB,
m, n, k, alpha,
a_array, lda,
b_array, ldb, beta,
c_array, ldc,
GRP_COUNT, size_per_grp); std::cout << "a.size(): " << a.size() << std::endl;
for (int i = 0; i < a.size(); ++i) {
std::cout << a[i] << " ";
if ((i + 1) % 40 == 0)
std::cout << std::endl;
} std::cout << "b.size(): " << b.size() << std::endl;
for (int i = 0; i < b.size(); ++i) {
std::cout << b[i] << " ";
if ((i + 1) % 40 == 0)
std::cout << std::endl;
} std::cout << "c_array.size(): " << 20 * 20 * 4 << std::endl;
for (int i = 0; i < 1600; ++i) {
std::cout << c[i] << " ";
if ((i + 1) % 80 == 0)
std::cout << std::endl;
}
std::cout << std::endl;

output:

a.size(): 800 ( 20 * 40 )
1 1 ... 1 1
...
1 1 ... 1 1
b.size(): 800 ( 20 * 40 )
1 1 ... 1 1
...
1 1 ... 1 1
c_array.size(): 1600 (40 * 40)
10 10 ... 10 10
...
10 10 ... 10 10
        int raw_rows = 20;
int raw_cols = 40;
std::vector<float> a(raw_rows * raw_cols, 1.0);
std::vector<float> b(raw_rows * raw_cols, 1.0);
std::vector<float> c(400, 0.0); #define GRP_COUNT 1
MKL_INT m[GRP_COUNT] = {5};
MKL_INT k[GRP_COUNT] = {10};
MKL_INT n[GRP_COUNT] = {5}; MKL_INT lda[GRP_COUNT] = {40};
MKL_INT ldb[GRP_COUNT] = {40};
MKL_INT ldc[GRP_COUNT] = {20}; CBLAS_TRANSPOSE transA[GRP_COUNT] = { CblasNoTrans };
CBLAS_TRANSPOSE transB[GRP_COUNT] = { CblasTrans }; float alpha[GRP_COUNT] = {1.0};
float beta[GRP_COUNT] = {0.0}; const MKL_INT size_per_grp[GRP_COUNT] = {16}; const float *a_array[16], *b_array[16];
float *c_array[16];
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
a_array[i*4+j] = a.data() + i * 5 * 40 + j * 10;
b_array[i*4+j] = b.data() + i * 5 * 40 + j * 10;
c_array[i*4+j] = c.data() + i * 5 * 20 + j * 5;
}
} cblas_sgemm_batch (CblasRowMajor, transA, transB,
m, n, k, alpha,
a_array, lda,
b_array, ldb, beta,
c_array, ldc,
GRP_COUNT, size_per_grp); std::cout << "a.size(): " << a.size() << std::endl;
for (int i = 0; i < a.size(); ++i) {
std::cout << a[i] << " ";
if ((i + 1) % 40 == 0)
std::cout << std::endl;
} std::cout << "b.size(): " << b.size() << std::endl;
for (int i = 0; i < b.size(); ++i) {
std::cout << b[i] << " ";
if ((i + 1) % 40 == 0)
std::cout << std::endl;
} std::cout << "c_array.size(): " << 5 *5 * 16 << std::endl;
for (int i = 0; i < 400; ++i) {
std::cout << c[i] << " ";
if ((i + 1) % 20 == 0)
std::cout << std::endl;
}
std::cout << std::endl;

output:

a.size(): 800 ( 20 * 40 )
1 1 ... 1 1
...
1 1 ... 1 1
b.size(): 800 ( 20 * 40 )
1 1 ... 1 1
...
1 1 ... 1 1
c_array.size(): 400 (20 * 20)
10 10 ... 10 10
...
10 10 ... 10 10

Intel MKL函数之 cblas_sgemm、cblas_sgemm_batch的更多相关文章

  1. Intel MKL函数,如何得到相同的计算结果?【转】

    在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的OS中,程序运行的结果每一位都完全相同. 事实上,程序往往很难保证做到这一点. 为什么呢? 我们先看一个简单的例子: 当程序 ...

  2. Intel MKL 多线程设置

    对于多核程序,多线程对于程序的性能至关重要. 下面,我们将对Intel MKL 有关多线程方面的设置做一些介绍: 我们提到MKL 支持多线程,它包括的两个概念:1>MKL 是线程安全的: MKL ...

  3. Intel MKL(Math Kernel Library)

    1.Intel MKL简介 Intel数学核心函数库(MKL)是一套高度优化.线程安全的数学例程.函数,面向高性能的工程.科学与财务应用.英特尔 MKL 的集群版本包括 ScaLAPACK 与分布式内 ...

  4. BLAS 与 Intel MKL 数学库

    0. BLAS BLAS(Basic Linear Algebra Subprograms)描述和定义线性代数运算的规范(specification),而不是一种具体实现,对其的实现包括: AMD C ...

  5. 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能

    比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ...

  6. Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll

    Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 在使用Anaconda创建一个虚拟环境出来,然后安装了scikit-learn.nump ...

  7. 遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题的解决方法

    运行一个基于tensorflow的模型时,遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题. 解决方法:打开 ...

  8. ubuntu配置机器学习环境(四) 安装intel MKL

    在这一模块可以选择(ATLAS,MKL或者OpenBLAS),我这里使用MKL,首先下载并安装英特尔® 数学内核库 Linux* 版MKL,下载链接, 请下载Student版,先申请,然后会立马收到一 ...

  9. 在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理

    在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理 直接在NVIDIA(CUDA,CUBLAS)或Intel MKL上进行高度定制和优化的BERT推理,而无需tenso ...

随机推荐

  1. RedisTemplate访问Redis数据结构(前言)

    Redis五种基本数据结构 redis提供键值对的形式对数据进行存储.支持五种数据类型:String(字符串),List(链表),Hash(散列),Set(无序集合),ZSet(有序集合).下面是网上 ...

  2. Planting Trees

    Planting Trees 给定N*N矩阵,求子矩形满足里面最大元素最小元素之差不超过M 单调队列 枚举上边界,下边界,及右边界, 用两个单调队列,一个维护最大值,一个维护最小 求左边界 #incl ...

  3. 对象数组(JSON) 根据某个共同字段 分组

    1.在前端页面用js处理 转载https://www.cnblogs.com/rysinal/p/5834446.html 为了第二种方法对比,特意把id 转化为pid var arr = [ {&q ...

  4. inode节点用尽处理

    linux inode已满解决方法 原文 今天login server的一个网站,发现login后没有生成session.根据以往经验,一般是空间已满导致session文件生成失败. df -h Fi ...

  5. 软件-工具:Beyond Compare

    ylbtech-软件-工具:Beyond Compare 1.返回顶部 1. Beyond Compare是一套由Scooter Software推出的文件比较工具.主要用途是对比两个文件夹或者文件, ...

  6. pycharm中git配置(coding.net为例)

    1.在coding.net注册一个账号 2.登陆coding.net 3.新建项目->输入项目名称.项目描述->初始化仓库选择readme.md并且添加一个appachev2的开源许可证- ...

  7. Tomcat/weblogic session失效时间的几种设置方法

    一.在容器中设置tomcat中配置server.xml中定义context时采用如下定义: <Context path="/livsorder" docBase=" ...

  8. 让人失望透顶的 CSDN 博客改版

    前言 在 CSDN 写博已经 2 年有余,相比一些大佬,时间不算太长.但工作再忙,我也会保持每月产出,从未间断.每天上线回复评论,勘误内容,参加活动,看看阅读量已经成为一种习惯,可以说是 CSDN 博 ...

  9. Delphi XE2 之 FireMonkey 入门(22) - 数据绑定: BindingSource、BindingName、FindBinding()、Binding[]

    在窗体上添加 TrackBar1.Edit1.Label1, 然后设置属性(可在设计时): procedure TForm1.FormCreate(Sender: TObject); begin   ...

  10. iView 实战系列教程(21课时)_3.iView 实战教程之布局篇(一)

    Grid布局 先了解一下iview的24栅格布局 清理一下App.vue 然后从iview的color里面获取推荐的背景色 我们先渲染栅格 24列,然后再讲解他是一个什么东西: 栅格外面row包裹的, ...