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

1.      include文件:

(1)、<glog/logging.h>:GLog库,它是google的一个开源的日志库,其使用可以参考:http://blog.csdn.net/fengbingchun/article/details/48768039

(2)、<caffe/common.hpp>、<caffe/util/device_alternate.hpp>:这两个文件的介绍可以参考: http://blog.csdn.net/fengbingchun/article/details/54955236 ;

2.      <caffe/util/mkl_alternate.hpp>文件:

这个文件里包含两种库,一个是Intel MKL,一个是OpenBLAS,这里用的是OpenBLAS。如果商用Intel MKL是需要付费的,下面仅对Intel MKL进行简单介绍。

Intel MKL(Math Kernel Library)即Intel数学核心函数库,它是一套高度优化和广泛线程安全的数学例程,专为需要极致性能的科学、工程及金融等领域的应用而设计。核心数学函数包括BLAS、LAPACK、ScaLAPACK、Sparse Solver、快速傅里叶变换、矢量数学及其它函数。它可以为当前及下一代英特尔处理器提供性能优化,包括更出色地与Microsoft Visual Studio、Eclipse和XCode相集成。英特尔MKL支持完全集成英特尔兼容性OpenMP运行时库,以实现更出色的Windows/Linux跨平台兼容性。

关于OpenBLAS的介绍可以参考: http://blog.csdn.net/fengbingchun/article/details/55509764

在github/fengbingchun/Caffe_Test中<mkl_alternate.hpp>中走的是OpenBLAS分支。

(1)、定义了一些宏:

DEFINE_VSL_UNARY_FUNC:一元函数,包括Sqr、Exp、Ln、Abs,对应的函数为vsSqr、vsExp、vsLn、vsAbs、vdSqr、vdExp、vdLn、vdAbs,支持float和double类型。

DEFINE_VSL_UNARY_FUNC_WITH_PARAM:带一个参数的一元函数,包括Powx,对应的函数为vsPowx、vdPowx,支持float和double类型。

DEFINE_VSL_BINARY_FUNC:二元函数,包括Add、Sub、Mul、Div,对应的函数为vsAdd、vsSub、vsMul、vsDiv、vdAdd、vdSub、vdMul、vdDiv,支持float和double类型。

(2)、定义了axpby函数,支持两种类型,cblas_saxpby、cblas_daxpby,如果设置incX和incY为1(即步长为1),则:Y=alpha*X+beta*Y

mkl_alternate文件测试代码如下:

int test_caffe_util_mkl_alternate()
{
	const int N{ 5 };
	float a[N] {1, 2, 3, 4, 5}, b{ 2 }, alpha{ 0.2f }, beta{0.4f};
	float y1[N], y2[N], y3[N], y4[N]{6, 7, 8, 9, 10};

	fprintf(stderr, "test unary function: vsSqr\n");
	vsSqr(N, a, y1);
	for (auto ret : y1) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test function unary function with singular parameter: vsPowx\n");
	vsPowx(N, a, b, y2);
	for (auto ret : y2) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test binary function: vsAdd\n");
	vsAdd(N, a, a, y3);
	for (auto ret : y3) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test axpby function(Y=alpha*X+beta*Y): cblas_saxpby\n");
	cblas_saxpby(N, alpha, a, 1, beta, y4, 1);
	for (auto ret : y4) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	return 0;
}

执行结果如下:

3.      math_functions文件内函数:封装了一些基础的数学运算函数

(1)、caffe_cpu_gemm:C=alpha*A*B+beta*C;

(2)、caffe_cpu_gemv:y=alpha*A*x+beta*y;

(3)、caffe_axpy:Y=alpha*X+Y;

(4)、caffe_cpu_axpby:Y=alpha*X+beta*Y;

(5)、caffe_copy:从X中拷贝前N个元素到Y中;

(6)、caffe_set:将X中的前N个元素置为alpha;

(7)、caffe_add_scalar:给Y中的前N个元素分别加上常数alpha;

(8)、caffe_scal:X = alpha*X;

(9)、caffe_sqr/ caffe_exp/caffe_log/caffe_abs:会调用mkl_alternate.hpp中的vsSqr、vsExp、vsLn、vsAbs、vdSqr、vdExp、vdLn、vdAbs函数;

(10)、caffe_add/caffe_sub/caffe_mul/caffe_div:会调用mkl_alternate.hpp中的vsAdd、vsSub、vsMul、vsDiv、vdAdd、vdSub、vdMul、vdDiv函数;

(11)、caffe_powx:会调用mkl_alternate.hpp中的vsPowx和vdPowx函数;

(12)、caffe_rng_rand:返回一个unsignedint类型的随机数;

(13)、caffe_nextafter:在最大方向上,返回b可以表示的最接近的数值;

(14)、caffe_rng_uniform:产生指定范围内的均匀分布随机数;

(15)、caffe_rng_gaussian:产生高斯分布随机数;

(16)、caffe_rng_bernoulli:产生伯努利分布随机数;

(17)、caffe_cpu_dot:计算步长为1的内积;

(18)、caffe_cpu_strided_dot:计算指定步长的内积;

(19)、caffe_cpu_hamming_distance:计算x、y之间的海明距离;

(20)、caffe_cpu_asum:计算向量x中前n个元素的绝对值之和;

(21)、caffe_sign:类似于正负号函数,仅返回-1或1;

(22)、caffe_cpu_scale:Y=alpha*X 。

4.        宏DEFINE_CAFFE_CPU_UNARY_FUNC:一元函数,类似于mkl_alternate.hpp中的宏DEFINE_VSL_UNARY_FUNC,包括:

(1)、caffe_cpu_sign:正负号函数,输出-1、0、1;

(2)、caffe_cpu_sgnbit:作用类似于std::signbit,static_cast<bool>((std::signbit)(x));x为负数输出为1,其它输出为0;

(3)、caffe_cpu_fabs:取绝对值,作用类似于std::fabs。

math_functions文件测试代码如下:

int test_caffe_util_math_functions()
{
	float alpha{ 0.5f }, beta{ 0.1f };
	// h*w: A: 2*3; B: 3*4; C: 2*4
	float A[2 * 3] {1, 2, 3, 4, 5, 6}, B[3 * 4] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12},
		y1[2 * 4]{1, 2, 3, 4, 5, 6, 7, 8}, x[3]{1, 2, 3}, y2[2]{1, 2},
		y3[6] {1, 2, 3, 4, 5, 6}, y4[6] {1, 2, 3, 4, 5, 6},
		y7[6]{1, 2, 3, 4, 5, 6}, y10[6] {1, 2, 3, 4, 5, 6},
		y11[6] {1, 2, 3, 4, 5, 6}, C[6] {-2, -1, 0, 1, 2, 3}, y19[6] {-10, -10, -10, -10, -10, -10};
	float  y5[6], y6[6], y20[6], y21[6], y22[6];
	int y12[6] {1, 2, 3, 4, 5, 6};

	fprintf(stderr, "test math function: caffe_cpu_gemm(C=alpha*A*B+beta*C)\n");
	// A、B、y1: matrix
	caffe::caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, 2, 4, 3, alpha, A, B, beta, y1);
	for (auto ret : y1) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_cpu_gemv(y=alpha*A*x+beta*y)\n");
	// A: matrix; x、y2: vector
	caffe::caffe_cpu_gemv(CblasNoTrans, 2, 3, alpha, A, x, beta, y2);
	for (auto ret : y2) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_axpy(Y=alpha*X+Y)\n");
	caffe::caffe_axpy(6, alpha, A, y3);
	for (auto ret : y3) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_cpu_axpby(Y= alpha*X+beta*Y)\n");
	caffe::caffe_cpu_axpby(6, alpha, A, beta, y4);
	for (auto ret : y4) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_copy\n");
	caffe::caffe_copy(3, A, y5);
	for (auto ret : y5) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_set\n");
	caffe::caffe_set(3, alpha, y6);
	for (auto ret : y6) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_scal(X=alpha*X)\n");
	caffe::caffe_scal(4, alpha, y7);
	for (auto ret : y7) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_rng_rand\n");
	unsigned int y8 = caffe::caffe_rng_rand();
	fprintf(stderr, "caffe rng rand: %d\n", y8);

	fprintf(stderr, "test math function: caffe_nextafter\n");
	float y9 = caffe::caffe_nextafter(alpha);
	fprintf(stderr, " caffe next after: %f\n", y9);

	fprintf(stderr, "test math function: caffe_rng_uniform\n");
	caffe::caffe_rng_uniform(4, -2.f, 2.f, y10);
	for (auto ret : y10) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_rng_gaussian\n");
	caffe::caffe_rng_gaussian(4, -2.f, alpha, y11);
	for (auto ret : y11) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_rng_bernoulli\n");
	caffe::caffe_rng_bernoulli(4, alpha, y12);
	for (auto ret : y12) {
		fprintf(stderr, "%d    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_cpu_dot\n");
	float y13 = caffe::caffe_cpu_dot(3, A, B);
	fprintf(stderr, "caffe cpu dot: %f\n", y13);

	fprintf(stderr, "test math function: caffe_cpu_strided_dot\n");
	float y14 = caffe::caffe_cpu_strided_dot(2, A, 2, B, 2);
	fprintf(stderr, "caffe cpu strided dot: %f\n", y14);

	fprintf(stderr, "test math function: caffe_cpu_hamming_distance\n");
	int y15 = caffe::caffe_cpu_hamming_distance(4, A, C);
	fprintf(stderr, "caffe cpu hamming distance: %d\n", y15);

	fprintf(stderr, "test math function: caffe_cpu_asum\n");
	float y16 = caffe::caffe_cpu_asum(5, C);
	fprintf(stderr, "caffe cpu asum: %f\n", y16);

	fprintf(stderr, "test math function: caffe_sign\n");
	int8_t y17 = caffe::caffe_sign(-10.0f);
	int8_t y18 = caffe::caffe_sign(10.0f);
	fprintf(stderr, "caffe sign: -10.0f: %d, 10.0f: %d\n", y17, y18);

	fprintf(stderr, "test math function: caffe_cpu_scale\n");
	caffe::caffe_cpu_scale(5, alpha, C, y19);
	for (auto ret : y19) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_cpu_sign\n");
	caffe::caffe_cpu_sign(5, C, y20);
	for (auto ret : y20) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_cpu_sgnbit\n");
	caffe::caffe_cpu_sgnbit(5, C, y21);
	for (auto ret : y21) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	fprintf(stderr, "test math function: caffe_cpu_fabs\n");
	caffe::caffe_cpu_fabs(5, C, y22);
	for (auto ret : y22) {
		fprintf(stderr, "%f    ", ret);
	}
	fprintf(stderr, "\n");

	return 0;
}

执行结果如下:

Caffe源码中math_functions文件分析的更多相关文章

  1. Caffe源码中common文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中的一些重要头文件如caffe.hpp.blob.hpp等或者外部调用Caffe库使用时,一般都会in ...

  2. Caffe源码中syncedmem文件分析

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

  3. Caffe源码中caffe.proto文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下caffe.proto文件. 在src/caffe/proto目录下有一个 ...

  4. 【神经网络与深度学习】Caffe源码中各种依赖库的作用及简单使用

    1.      Boost库:它是一个可移植.跨平台,提供源代码的C++库,作为标准库的后备. 在Caffe中用到的Boost头文件包括: (1).shared_ptr.hpp:智能指针,使用它可以不 ...

  5. tf源码中的object_detection_tutorial.ipynb文件

    今天看到原来下载的tf源码的目标检测源码中test的代码不知道跑哪儿去了,这里记录一下... Imports import numpy as np import os import six.moves ...

  6. caffe源码学习

    本文转载自:https://buptldy.github.io/2016/10/09/2016-10-09-Caffe_Code/ Caffe简介 Caffe作为一个优秀的深度学习框架网上已经有很多内 ...

  7. 从express源码中探析其路由机制

    引言 在web开发中,一个简化的处理流程就是:客户端发起请求,然后服务端进行处理,最后返回相关数据.不管对于哪种语言哪种框架,除去细节的处理,简化后的模型都是一样的.客户端要发起请求,首先需要一个标识 ...

  8. Android 网络框架之Retrofit2使用详解及从源码中解析原理

    就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...

  9. linux源码Makefile的详细分析

    目录 一.概述 1.本文的意义 2.Linux内核Makefile文件组成 二.Linux内核Makefile的“make解析”过程 1 顶层Makefile阶段 1.从总目标uImage说起 2.v ...

随机推荐

  1. Rxjava学习(二操作符)

    操作符是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件 1.filter filter()操作符是可 ...

  2. [20170615]执行dbms_sqldiag.dump_trace看执行计划.txt

    [20170615]执行dbms_sqldiag.dump_trace看执行计划.txt --//上午在想查看10053执行计划时使用包时出现如下提示: SCOTT@book> @ &r ...

  3. [20170927]关于hugepages.txt

    [20170927]关于hugepages.txt --//今天测试hugepages与内核参数nr_overcommit_hugepages,才发现HugePages_Surp表示什么? --// ...

  4. JMeter—逻辑控制器(六)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第一节JMeter逻辑控制器 JMeter逻辑控制器可以对元件的执行逻辑进行控制,除仅一次控制器外,其他可以嵌套 ...

  5. 洗礼灵魂,修炼python(37)--面向对象编程(7)—了解魔法方法

    也许上一篇博文提到的property内置函数的用法你还觉得记忆犹新,那么有没有更多的类似的方法呢?有的,就是本篇文章要说的魔法方法 魔法方法 1.什么是魔法方法 (其实前面已经提到多次,每次我都是说暂 ...

  6. 安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details"错误.原因是启动"VisualSVN Server"失败

    安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server ...

  7. npm与yarn常用命令对比

    最近在用yarn,但是命令老是记不住,在此记录,方便日后翻看 图片截取自:http://yuanhehe.cn/2017/06/11/npm-%E4%B8%8E-Yarn-%E5%B8%B8%E7%9 ...

  8. SQL Server自动备份存储过程和视图的方法

    1 建立备份数据表 CREATE TABLE [dbo].[ProcBackup]( ,) NOT NULL, [name] [sysname] NOT NULL, ) NULL, [obj_id] ...

  9. Vlc支持IE 360 低版本的Google浏览器

    VLC 插件代码: <object type='application/x-vlc-plugin' pluginspage="http://www.videolan.org/" ...

  10. 用Python做股市数据分析(二)

    本文由 伯乐在线 - 小米云豆粥 翻译.未经许可,禁止转载!英文出处:Curtis Miller.欢迎加入翻译组. 这篇博文是用Python分析股市数据系列两部中的第二部,内容基于我在犹他大学 数学3 ...