这是我使用的,以及对我有用的东西。

char matdescra[6] = {'g', 'l', 'n', 'c', 'x', 'x'};

/* https://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-34C8DB79-0139-46E0-8B53-99F3BEE7B2D4.htm#TBL2-6

G: General. D: Diagonal

L/U Lower/Upper triangular (ignored with G)

N: non-unit diagonal (ignored with G)

C: zero-based indexing.

*/

完整的例子

下面是一个完整的例子。我首先通过用指定密度的非零元素填充密集矩阵来创建一个随机矩阵。然后我将它转换为CSR格式的稀疏矩阵。最后,我使用mkl_dcsrmm来进行乘法运算。作为可能的检查(检查未完成),我使用密集矩阵使用cblas_dgemm函数进行相同的乘法运算。

#include "mkl.h"

#include "mkl_spblas.h"

#include // For NULL

#include // for rand()

#include

#include

#include

// Compute C = A * B; where A is sparse and B is dense.

int main() {

MKL_INT m=10, n=5, k=11;

const double sparsity = 0.9; ///< @param sparsity Values below which are set to zero (sampled from uniform(0,1)-distribution).

double *A_dense;

double *B;

double *C;

double alpha = 1.0;

double beta = 0.0;

const int allignment = 64;

// Seed the RNG to always be the same

srand(42);

// Allocate memory to matrices

A_dense = (double *)mkl_malloc(m*k*sizeof(double), allignment);

B = (double *)mkl_malloc(k*n*sizeof(double), allignment);

C = (double *)mkl_malloc(m*n*sizeof(double), allignment);

if (A_dense == NULL || B == NULL || C == NULL) {

printf("ERROR: Can't allocate memory for matrices. Aborting... \n\n");

mkl_free(A_dense);

mkl_free(B);

mkl_free(C);

return 1;

}

// Initializing matrix data

int i;

int nzmax = 0;

for (i = 0; i < (m*k); i++) {

double val = rand()/(double)RAND_MAX;

if (val < sparsity) {

A_dense[i] = 0.0;

} else {

A_dense[i] = val;

nzmax++;

}

}

for (i = 0; i < (k*n); i++) {

B[i] = rand();

}

for (i = 0; i < (m*n); i++) {

C[i] = 0.0;

}

// Convert A to a sparse matrix in CSR format.

// INFO: https://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-AD67DD8D-4C22-4232-8D3F-AF97DC2ABBC8.htm#GUID-AD67DD8D-4C22-4232-8D3F-AF97DC2ABBC8

MKL_INT job[6];

job[0] = 0; // convert TO CSR.

job[1] = 0; // Zero-based indexing for input.

job[2] = 0; // Zero-based indexing for output.

job[3] = 2; // adns is a whole matrix A.

job[4] = nzmax; // Maximum number of non-zero elements allowed.

job[5] = 3; // all 3 arays are generated for output.

/* JOB: conversion parameters

* m: number of rows of A.

* k: number of columns of A.

* adns: (input/output). Array containing non-zero elements of the matrix A.

* lda: specifies the leading dimension of adns. must be at least max(1, m).

* acsr: (input/output) array containing non-zero elements of the matrix A.

* ja: array containing the column indices.

* ia length m+1, rowIndex.

* OUTPUT:

* info: 0 if successful. i if interrupted at i-th row because of lack of space.

*/

int info = -1;

printf("nzmax:\t %d\n", nzmax);

double *A_sparse = mkl_malloc(nzmax * sizeof(double), allignment);

if (A_sparse == NULL) {

printf("ERROR: Could not allocate enough space to A_sparse.\n");

return 1;

}

MKL_INT *A_sparse_cols = mkl_malloc(nzmax * sizeof(MKL_INT), allignment);

if (A_sparse_cols == NULL) {

printf("ERROR: Could not allocate enough space to A_sparse_cols.\n");

return 1;

}

MKL_INT *A_sparse_rowInd = mkl_malloc((m+1) * sizeof(MKL_INT), allignment);

if (A_sparse_rowInd == NULL) {

printf("ERROR: Could not allocate enough space to A_sparse_rowInd.\n");

return 1;

}

mkl_ddnscsr(job, &m, &k, A_dense, &k, A_sparse, A_sparse_cols, A_sparse_rowInd, &info);

if(info != 0) {

printf("WARNING: info=%d, expected 0.\n", info);

}

assert(info == 0);

char transa = 'n';

MKL_INT ldb = n, ldc=n;

char matdescra[6] = {'g', 'l', 'n', 'c', 'x', 'x'};

/* https://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-34C8DB79-0139-46E0-8B53-99F3BEE7B2D4.htm#TBL2-6

G: General. D: Diagonal

L/U Lower/Upper triangular (ignored with G)

N: non-unit diagonal (ignored with G)

C: zero-based indexing.

*/

mkl_dcsrmm(&transa, &m, &n, &m, &alpha, matdescra, A_sparse, A_sparse_cols,

A_sparse_rowInd, &(A_sparse_rowInd[1]), B, &ldb, &beta, C, &ldc);

// The same computation in dense format

cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,

m, n, k, alpha, A_dense, k, B, n, beta, C, n);

mkl_free(A_dense);

mkl_free(A_sparse);

mkl_free(A_sparse_cols);

mkl_free(A_sparse_rowInd);

mkl_free(B);

mkl_free(C);

return 0;

}

C语言 Mkl 矩阵乘法,与MKL的矩阵乘法相关推荐

  1. ACMNO.24 C语言-转置矩阵 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。 输入 一个3x3的矩阵 输出 转置后的矩阵 样例

    题目描述 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换. 输入 一个3x3的矩阵 输出 转置后的矩阵 样例输入 1 2 3 4 5 6 7 8 9 样例输出 1 4 7 2 5 8 3 ...

  2. R语言构建混淆矩阵(仿真数据)并基于混淆矩阵(confusion matrix)计算并计算Accuracy、Precision、Recall(sensitivity)、F1、Specificity指标

    R语言构建混淆矩阵(仿真数据)并基于混淆矩阵(confusion matrix)计算并计算Accuracy.Precision.Recall(sensitivity).F1.Specificity指标 ...

  3. R语言基础入门(10)之矩阵和数组

    目录 1.矩阵 创建矩阵 查看矩阵的行与列数 转置 2.矩阵子集 3.矩阵行列命名 4.命名后取子集 5.逻辑下标取子集 6.正整数向量的矩阵取子集 7.返回对角线向量 8.创建单位矩阵 9.cbin ...

  4. 将矩阵转为一行_理解矩阵乘法

    理解矩阵乘法 考研需要考一门课<线性代数>,这门课其实是教矩阵. 刚学的时候,还蛮简单的,矩阵加法就是相同位置的数字加一下. 矩阵乘法也类似,矩阵乘以一个常数,就是所有位置都乘以这个数. ...

  5. 数学基础(矢量, 向量,矩阵,相等,加法,乘法)

    (人脸,图像)真实的事物--->数学对象(矢量)--->矢量间的关系(数学算法或者性质,矩阵,加减法)--->另外一些矢量(特征比较明确)--->真实事物(图像,人脸) 矢量: ...

  6. Java实现矩阵运算——矩阵乘法、矩阵转置、自动填充矩阵行

    在做大数据或人工智能开发的过程做难免会遇到矩阵运算,本文在这里给大家实现一个简单的矩阵运算,请看下代码: package test;/*** 矩阵运算* * @author Administrator ...

  7. 矩阵的基础知识回顾:矩阵乘法,矩阵的逆,伴随矩阵,矩阵的转置,行列式,相似矩阵,实对称矩阵

    Agenda 1. 矩阵matrix 1.1 矩阵运算matrix operations 1.1.1 矩阵乘法matrix multiplication 1.1.1.1 简化矩阵乘法(facilita ...

  8. R语言产生对角阵、次对角阵等矩阵及矩阵运算

    R语言产生各种类型的矩阵及矩阵运算 R语言产生一般的矩阵 R语言产生单位阵 R语言产生次对角阵 R语言矩阵的常见运算 R语言产生一般的矩阵 # 依行排列,产生3行5列的矩阵 A = matrix(c( ...

  9. 6-2 编写Matrix类,使用二维数组实现矩阵,实现两个矩阵的乘法。 (30分) java pta

    编写程序题, 根据要求编写一个Java类,补充到代码中. 定义Matrix(矩阵)类,使用二维数组实现矩阵,实现两个矩阵的乘法.要求如下: 4个变量:row(行数),column(列数), matri ...

  10. c语言字母排直角三角形,C语言程序设计,输出形状为直角三角形的九九乘法表

    C语言程序设计,输出形状为直角三角形的九九乘法表 答案:7  信息版本:手机版 解决时间 2019-10-07 02:42 已解决 2019-10-06 07:05 C语言程序设计,输出形状为直角三角 ...

最新文章

  1. 高中计算机应用基础试讲,试讲计算机应用基础.ppt
  2. 提高服务器并发量,有关系统配置的常规方法
  3. winform实现简单的计算器V1版本
  4. 前端学习(2917):上午回顾
  5. Java如何实现分页
  6. Docker,使生信分析更简单、可重复
  7. iphone彻底删除照片如何恢复_苹果手机删除的照片如何恢复
  8. mysql lock trx id_MySQL中RR模式下死锁一例
  9. 使用dig或nslookup指定dns服务器查询域名解析
  10. struts2:表单标签
  11. js 与||的妙用
  12. 剑指前端(前端入门笔记系列)——Date对象
  13. 简易版的等待/唤醒方法(sleep,wait,await,park区别)适合面试回答
  14. 一二线城市知名 IT 互联网公司名单!
  15. IDEA如何开启远程调试
  16. java等额本金、等额本息计算
  17. 十二个一的宠物倾向分析
  18. python:输出10行的杨辉三角 - 二项式的n次方展开系数
  19. c语言中有符号数的补码,[分享]带符号数的表示-----补码
  20. 企业绿色创新转型-2002-2020工业企业科技创新指标汇总

热门文章

  1. (转)国内外Java学习网站/原作者:chjk1
  2. python中获取本地时间
  3. 多个pdf怎么合并成一个文件,用这个方法最快速
  4. 2017双十一阿里技术汇总
  5. iOS内购流程文档-Lion
  6. 怎样才能根除幽门螺旋杆菌?
  7. 同样是追星 ,为什么他们能这么做
  8. 策略迭代算法和值函数迭代算法
  9. TCP和UDP的区别整理
  10. 麓言信息UI设计字体排版的10条