本文转载自 Caffe源码(一):math_functions 分析

math_function 定义了caffe 中用到的一些矩阵操作和数值计算的一些函数,这里以float类型为例做简单的分析

1. caffe_cpu_gemm 函数:

  1. template<>
  2. void caffe_cpu_gemm<float>(const CBLAS_TRANSPOSE TransA,
  3. const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K,
  4. const float alpha, const float* A, const float* B, const float beta,
  5. float* C) {
  6. int lda = (TransA == CblasNoTrans) ? K : M;
  7. int ldb = (TransB == CblasNoTrans) ? N : K;
  8. cblas_sgemm(CblasRowMajor, TransA, TransB, M, N, K, alpha, A, lda, B,
  9. ldb, beta, C, N);
  10. }

功能: C=alpha*A*B+beta*C 
A,B,C 是输入矩阵(一维数组格式) 
CblasRowMajor :数据是行主序的(二维数据也是用一维数组储存的) 
TransA, TransB:是否要对A和B做转置操作(CblasTrans CblasNoTrans) 
M: A、C 的行数 
N: B、C 的列数 
K: A 的列数, B 的行数 
lda : A的列数(不做转置)行数(做转置) 
ldb: B的列数(不做转置)行数(做转置)

2. caffe_cpu_gemv 函数:

  1. template <>
  2. void caffe_cpu_gemv<float>(const CBLAS_TRANSPOSE TransA, const int M,
  3. const int N, const float alpha, const float* A, const float* x,
  4. const float beta, float* y) {
  5. cblas_sgemv(CblasRowMajor, TransA, M, N, alpha, A, N, x, , beta, y, );
  6. }

功能: y=alpha*A*x+beta*y 
其中X和Y是向量,A 是矩阵 
M:A 的行数 
N:A 的列数 
cblas_sgemv 中的 参数1 表示对X和Y的每个元素都进行操作

3.caffe_axpy 函数:

  1. template <>
  2. void caffe_axpy<float>(const int N, const float alpha, const float* X,
  3. float* Y) { cblas_saxpy(N, alpha, X, , Y, ); }

功能: Y=alpha*X+Y 
N:为X和Y中element的个数

4.caffe_set 函数:

  1. template <typename Dtype>
  2. void caffe_set(const int N, const Dtype alpha, Dtype* Y) {
  3. if (alpha == ) {
  4. memset(Y, , sizeof(Dtype) * N); // NOLINT(caffe/alt_fn)
  5. return;
  6. }
  7. for (int i = ; i < N; ++i) {
  8. Y[i] = alpha;
  9. }
  10. }

功能:用常数 alpha 对 Y 进行初始化 
函数 void *memset(void *buffer, char c, unsigned count) 一般为新申请的内存做初始化,功能是将buffer所指向内存中的每个字节的内容全部设置为c指定的ASCII值, count为块的大小

5.caffe_add_scalar 函数:

  1. template <>
  2. void caffe_add_scalar(const int N, const float alpha, float* Y) {
  3. for (int i = ; i < N; ++i) {
  4. Y[i] += alpha;
  5. }
  6. }

功能: 给 Y 的每个 element 加上常数 alpha

6.caffe_copy 函数:

  1. template <typename Dtype>
  2. void caffe_copy(const int N, const Dtype* X, Dtype* Y) {
  3. if (X != Y) {
  4. if (Caffe::mode() == Caffe::GPU) {
  5. #ifndef CPU_ONLY
  6. // NOLINT_NEXT_LINE(caffe/alt_fn)
  7. CUDA_CHECK(cudaMemcpy(Y, X, sizeof(Dtype) * N, cudaMemcpyDefault));
  8. #else
  9. NO_GPU;
  10. #endif
  11. } else {
  12. memcpy(Y, X, sizeof(Dtype) * N); // NOLINT(caffe/alt_fn)
  13. }
  14. }
  15. }

函数 void *memcpy(void *dest, void *src, unsigned int count) 把src所指向的内存区域 copy到dest所指向的内存区域, count为块的大小

7.caffe_scal 函数:

  1. template <>
  2. void caffe_scal<float>(const int N, const float alpha, float *X) {
  3. cblas_sscal(N, alpha, X, );
  4. }

功能:X = alpha*X 
N: X中element的个数

8.caffeine_cup_axpby 函数:

  1. template <>
  2. void caffe_cpu_axpby<float>(const int N, const float alpha, const float* X,
  3. const float beta, float* Y) {
  4. cblas_saxpby(N, alpha, X, , beta, Y, );
  5. }

功能:Y= alpha*X+beta*Y

9.caffe_add、 caffe_sub、 caffe_mul、 caffe_div 函数:

  1. template <>
  2. void caffe_add<float>(const int n, const float* a, const float* b,
  3. float* y) {
  4. vsAdd(n, a, b, y);
  5. }
  6. template <>
  7. void caffe_sub<float>(const int n, const float* a, const float* b,
  8. float* y) {
  9. vsSub(n, a, b, y);
  10. }
  11.  
  12. template <>
  13. void caffe_mul<float>(const int n, const float* a, const float* b,
  14. float* y) {
  15. vsMul(n, a, b, y);
  16. }
  17.  
  18. template <>
  19. void caffe_div<float>(const int n, const float* a, const float* b,
  20. float* y) {
  21. vsDiv(n, a, b, y);
  22. }

功能:这四个函数分别实现element-wise的加减乘除(y[i] = a[i] + - * \ b[i])

10.caffe_powx、 caffe_sqr、 caffe_exp、 caffe_abs 函数:

  1. template <>
  2. void caffe_powx<float>(const int n, const float* a, const float b,
  3. float* y) {
  4. vsPowx(n, a, b, y);
  5. }
  6.  
  7. template <>
  8. void caffe_sqr<float>(const int n, const float* a, float* y) {
  9. vsSqr(n, a, y);
  10. }
  11.  
  12. template <>
  13. void caffe_exp<float>(const int n, const float* a, float* y) {
  14. vsExp(n, a, y);
  15. }
  16.  
  17. template <>
  18. void caffe_abs<float>(const int n, const float* a, float* y) {
  19. vsAbs(n, a, y);
  20. }

功能 : 同样是element-wise操作,分别是y[i] = a[i] ^ b, y[i] = a[i]^2,y[i] = exp(a[i] ),y[i] = |a[i] |

11.int caffe_rng_rand 函数:

  1. unsigned int caffe_rng_rand() {
  2. return (*caffe_rng())();
  3. }

功能:返回一个随机数

12.caffe_nextafer 函数:

  1. template <typename Dtype>
  2. Dtype caffe_nextafter(const Dtype b) {
  3. return boost::math::nextafter<Dtype>(
  4. b, std::numeric_limits<Dtype>::max());
  5. }

功能 : 返回 b 最大方向上可以表示的最接近的数值。

13.caffe_cpu_strided_dot 函数:

  1. template <>
  2. double caffe_cpu_strided_dot<double>(const int n, const double* x,
  3. const int incx, const double* y, const int incy) {
  4. return cblas_ddot(n, x, incx, y, incy);
  5. }

功能: 返回 vector X 和 vector Y 的内积。 
incx, incy : 步长,即每隔incx 或 incy 个element 进行操作。

14.caffe_cpu_hamming_distance 函数:

  1. template <>
  2. int caffe_cpu_hamming_distance<float>(const int n, const float* x,
  3. const float* y) {
  4. int dist = ;
  5. for (int i = ; i < n; ++i) {
  6. dist += __builtin_popcount(static_cast<uint32_t>(x[i]) ^
  7. static_cast<uint32_t>(y[i]));
  8. }
  9. return dist;
  10. }

功能:返回 x 和 y 之间的海明距离。(两个等长字符串之间的海明距离是两个字符串对应位置的不同字符的个数。)

15. caffe_cpu_asum 函数:

  1. template <>
  2. float caffe_cpu_asum<float>(const int n, const float* x) {
  3. return cblas_sasum(n, x, );
  4. }

功能:计算 vector x 的所有element的绝对值之和。

16.caffe_cpu_scale 函数:

  1. template <>
  2. void caffe_cpu_scale<float>(const int n, const float alpha, const float *x,
  3. float* y) {
  4. cblas_scopy(n, x, , y, );
  5. cblas_sscal(n, alpha, y, );
  6. }

功能:y = alpha*x

Caffe 使用记录(五):math_functions 分析的更多相关文章

  1. 20160512关于mac安装caffe的记录

    记得2015年在mac系统上安装过一次caffe,非常顺利,但是最近群里许多同学反映mac安装caffe出现了各种问题,同时我也在帮助别人安装caffe的时候也遇到了一些坑,不再像以前这么顺利了.估计 ...

  2. Caffe源码中math_functions文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下math_functions文件. 1.      include文件: ...

  3. LoadRunner11学习记录五 -- 错误提示分析

    LoadRunner测试结果具体分析: 一.错误提示分析  分析实例: 1.Error: Failed to connect to server “172.17.7.230″: [10060] Con ...

  4. EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    前言 Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不 ...

  5. 自媒体时代网络脱口秀节目的“五W”分析——以《罗辑思维》为例

    摘 要:随着互联网的发展,网络媒介生态的变化正在悄然进行.一大批网络自媒体节目<罗辑思维><晓说><凯子曰>等进入大众视线,成为大众关注的新焦点,其中<罗辑思 ...

  6. Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  7. 基于Cesium三维地图项目记录_通视分析功能的实现

    实现了剖面分析功能之后,下面来看看如何实现通视分析,还是基本按照之前的思路实现: 了解软件LocaScape是怎么实现的: 网址如下:http://www.locaspace.cn/V3.0/help ...

  8. leveldb 学习记录(五)SSTable格式介绍

    本节主要记录SSTable的结构 为下一步代码阅读打好基础,考虑到已经有大量优秀博客解析透彻 就不再编写了 这里推荐 https://blog.csdn.net/tankles/article/det ...

  9. [转]EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    本文转自:https://www.cnblogs.com/GuZhenYin/p/5556732.html Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据 ...

随机推荐

  1. MFC笔记5

    1.MessageBox()             引用自(http://www.douban.com/note/40199603/) 一 函数原型及参数 function MessageBox(h ...

  2. 数据库启动windows

    1.上 MongoDB官网下载数据库,下载之后选择自己想放的文件夹要记住文件夹位置,比如我下载之后就放在D盘,改文件夹为 mongodb 2.启动之前要给mongodb指定一个文件夹,这里取名为&qu ...

  3. input只允许输入正整数

    onkeyup="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=t ...

  4. JAVA中float与double的区别

    float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间 double是双精度类型,精度是17位有效数字,取值范围是10的-308次方到 ...

  5. react官方脚手架搭建项目

    1.全局安装 npm install -g create-react-app 2. app后面还要给项目文件命名 create-react-app //是全局命令来创建react项目 3.然后按照提示 ...

  6. 拉普拉斯平滑处理 Laplace Smoothing

    背景:为什么要做平滑处理? 零概率问题,就是在计算实例的概率时,如果某个量x,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0.在文本分类的问题中,当一个词语没有在训练样本中出现,该词 ...

  7. (十)创建ROS消息和ROS服务

    ROS总教程(中文版) 110.创建ROS消息和ROS服务

  8. DevExpress数据源 BindingList<FilesList> 与BindSource 使用区别

    这两个都能实现对接girdcontrol.datasource . 我只是说我自己用的时候的差异 bingsource  bs 添加了对象 之后成为一个对象集合  你是无法用foreach (var ...

  9. redis使用规范文档 20170522版

    运维redis很久了,一直是口头给rd说各种要求,尝试把这些规范总结成文档 摘选一些可能比较通用的规则如下: 强制:所有的key设置过期时间(最长可设置过期时间10天,如有特殊要求,联系dba说明原因 ...

  10. CSU 1684-Disastrous Downtime

    题目链接:https://nanti.jisuanke.com/t/28879 思路:贪心,从最早收到请求的时刻开始,统计每个相差1000毫秒的时间段内接收的请求数量再计算该时间段内所需机器数目,答案 ...