cblas_segmm函数学习

15 篇文章 0 订阅
6 篇文章 0 订阅

函数定义:

cblas_sgemm(order, transA, transB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDA);

第一个参数的函数是存储的有限性,有行优先和列优先(c语言是行优先)
第二个参数和第三个参数是是否转置
A矩阵经过transA之后的维度是M×K
B矩阵经过transB之后的维度是K×N
C矩阵的维度是M×N
LDA和LDB是对应矩阵还没变换之前,在主维度方向的维度。(如果是行优先就是列数)。

#include <stdio.h>
#include <cblas.h>

int main() {
  int i, j;
  float a[6]={1,3,5,2,7,8};
  float b[6]={5,3,7,2,4,2};
  float c[6]={0,0,0,0,0,0};
  cblas_sgemm(CblasRowMajor, CblasTrans, CblasTrans, 3, 3, 2, 1.0, a, 3, b, 2, 0.0, c, 3);
  for(i = 0; i < 3; ++i){
    for(j = 0; j < 3; ++j){
      printf("%f ", c[i*3+j]);
    }
    printf("\n");
  }
  return 1;
}

运行结果
这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是cblas_dgemm函数的源代码: ``` #include "cblas.h" void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const double alpha, const double *A, const int lda, const double *B, const int ldb, const double beta, double *C, const int ldc) { char TA, TB; int nrowa, nrowb, lda_t, ldb_t; double *buffer; if (Order == CblasRowMajor) { nrowa = K; nrowb = N; TA = (TransB == CblasNoTrans) ? 'T' : 'N'; TB = (TransA == CblasNoTrans) ? 'T' : 'N'; lda_t = ldb; ldb_t = lda; } else { nrowa = M; nrowb = K; TA = (TransA == CblasNoTrans) ? 'T' : 'N'; TB = (TransB == CblasNoTrans) ? 'T' : 'N'; lda_t = lda; ldb_t = ldb; } buffer = (double *) malloc(nrowa * nrowb * sizeof(double)); if (buffer == NULL) { fprintf(stderr, "Memory allocation failed\n"); exit(1); } /* Compute buffer = A * B */ dgemm_(&TA, &TB, &nrowa, &nrowb, &K, &alpha, A, &lda_t, B, &ldb_t, &beta, buffer, &nrowa); /* Copy buffer to C */ if (Order == CblasRowMajor) { int i, j; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { C[i * ldc + j] = buffer[j * nrowa + i]; } } } else { int i, j; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { C[i + j * ldc] = buffer[i * nrowb + j]; } } } free(buffer); } ``` 这个函数实现了矩阵乘法,调用了BLAS库中的dgemm()函数进行计算。该函数支持两种不同的矩阵存储方式:行优先存储和列优先存储。函数首先根据存储方式调整输入矩阵的维度和转置方式,然后使用dgemm()函数计算出结果并将其存储在内存中的缓冲区中。最后,函数将缓冲区中的结果复制到输出矩阵中。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值