Intel MKL函数之 cblas_sgemm、cblas_sgemm_batch
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的更多相关文章
- Intel MKL函数,如何得到相同的计算结果?【转】
		在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的OS中,程序运行的结果每一位都完全相同. 事实上,程序往往很难保证做到这一点. 为什么呢? 我们先看一个简单的例子: 当程序 ... 
- Intel MKL 多线程设置
		对于多核程序,多线程对于程序的性能至关重要. 下面,我们将对Intel MKL 有关多线程方面的设置做一些介绍: 我们提到MKL 支持多线程,它包括的两个概念:1>MKL 是线程安全的: MKL ... 
- Intel MKL(Math Kernel Library)
		1.Intel MKL简介 Intel数学核心函数库(MKL)是一套高度优化.线程安全的数学例程.函数,面向高性能的工程.科学与财务应用.英特尔 MKL 的集群版本包括 ScaLAPACK 与分布式内 ... 
- BLAS 与 Intel MKL 数学库
		0. BLAS BLAS(Basic Linear Algebra Subprograms)描述和定义线性代数运算的规范(specification),而不是一种具体实现,对其的实现包括: AMD C ... 
- 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
		比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ... 
- Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll
		Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 在使用Anaconda创建一个虚拟环境出来,然后安装了scikit-learn.nump ... 
- 遇到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问题. 解决方法:打开 ... 
- ubuntu配置机器学习环境(四) 安装intel MKL
		在这一模块可以选择(ATLAS,MKL或者OpenBLAS),我这里使用MKL,首先下载并安装英特尔® 数学内核库 Linux* 版MKL,下载链接, 请下载Student版,先申请,然后会立马收到一 ... 
- 在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理
		在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理 直接在NVIDIA(CUDA,CUBLAS)或Intel MKL上进行高度定制和优化的BERT推理,而无需tenso ... 
随机推荐
- 区间查询异或最大值——cf1100F,hdu6579
			cf1100F是静态区间查询最大值,有离线的解法,我感觉线段树或者莫队应该都能过 更优秀的解法可以在线并支持修改,可以解决hdu6579,即依次插入每个数,pos[i][j]表示在插第i个数时第j个基 ... 
- Leetcode  12.   Integer to Roman(打表,水)
			12. Integer to Roman Medium Roman numerals are represented by seven different symbols: I, V, X, L, C ... 
- 转载--C 的回归
			转载自http://blog.codingnow.com/2007/09/c_vs_cplusplus.html 周末出差,去另一个城市给公司的一个项目解决点问题.回程去机场的路上,我用手机上 goo ... 
- 【HDOJ6731】Angle Beats(极角排序)
			题意:二维平面上给定n个整点,q个询问 每个询问给定另外的一个整点,问其能与n个整点中任意取2个组成的直角三角形的个数 保证所有点位置不同 n<=2e3,q<=2e3,abs(x[i],y ... 
- 利用python进行数据分析--pandas入门2
			随书练习,第五章 pandas入门2 # coding: utf-8 # In[1]: from pandas import Series,DataFrame import pandas as pd ... 
- Linux驱动开发1——基础知识
			1.三类驱动 字符设备驱动:字节流,/dev下有设备节点,file_operations,inode, file 块设备驱动:数据块,/dev下有设备节点,通常有文件系统 网络设备驱动:网络报文的收发 ... 
- ORA-00346,借助_allow_resetlogs_corruption开库
			Mon Aug 06 10:15:08 2018Errors in file /data/app/oracle/diag/rdbms/prod/prod/trace/prod_ora_6831.trc ... 
- pycharm中git配置(coding.net为例)
			1.在coding.net注册一个账号 2.登陆coding.net 3.新建项目->输入项目名称.项目描述->初始化仓库选择readme.md并且添加一个appachev2的开源许可证- ... 
- dcef3 为按钮添加单击事件
			http://ju.outofmemory.cn/entry/78083 dcef3 为按钮添加单击事件 BccSafe's Blog 2014-06-01 3706 阅读 DOM 演示dcef3操作 ... 
- 大数据架构师必读的NoSQL建模技术
			大数据架构师必读的NoSQL建模技术 从数据建模的角度对NoSQL家族系统做了比较简单的比较,并简要介绍几种常见建模技术. 1.前言 为了适应大数据应用场景的要求,Hadoop以及NoSQL等与传统企 ... 
