一个基于arm架构的gemm项目
文章目录
- 前言
- 一、makefile
- 二、makeoutput(终端反馈日志)
- 三、解析此过程
- 3.1 make是什么
- 总结
前言
我的思路就是,从makefile和makefile的输出日志入手,看懂项目的运行原理
链接各个不同的项目子文件,走一遍整个流程
但是我自知记忆力一般,容易忘记,遂纪录在此
项目地点
一、makefile
OLD := MMult_4x4_10
NEW := MMult_4x4_21
# ARCH := armv7-a
# ARCH := aarch64
ARCH := native#
# sample makefile
#CC := g++
LINKER := $(CC)
#CFLAGS := -O0 -g -Wall
CFLAGS := -std=c++17 -O2 -g -march=$(ARCH) -ftree-vectorize
LDFLAGS := -lmUTIL := copy_matrix.o \compare_matrices.o \random_matrix.o \dclock.o \REF_MMult.o \print_matrix.oTEST_OBJS := test_MMult.o $(NEW).o %.o: %.cpp$(CC) $(CFLAGS) -c $< -o $@all: make clean;make test_MMult.xtest_MMult.x: $(TEST_OBJS) $(UTIL) parameters.h$(LINKER) $(TEST_OBJS) $(UTIL) $(LDFLAGS) \$(BLAS_LIB) -o $(TEST_BIN) $@ run: make allexport OMP_NUM_THREADS=1export GOTO_NUM_THREADS=1echo "version = '$(NEW)';" > output_$(NEW).m./test_MMult.x >> output_$(NEW).mcp output_$(OLD).m output_old.mcp output_$(NEW).m output_new.mclean:rm -f *.o *~ core *.xcleanall:rm -f *.o *~ core *.x output*.m *.eps *.png
二、makeoutput(终端反馈日志)
make all
make[1]: Entering directory '/home/ywc/HPC/how-to-optimize-gemm-fromgit/how-to-optimize-gemm/aarch64'
make clean;
make[2]: Entering directory '/home/ywc/HPC/how-to-optimize-gemm-fromgit/how-to-optimize-gemm/aarch64'
rm -f *.o *~ core *.x
make[2]: Leaving directory '/home/ywc/HPC/how-to-optimize-gemm-fromgit/how-to-optimize-gemm/aarch64'
make test_MMult.x
make[2]: Entering directory '/home/ywc/HPC/how-to-optimize-gemm-fromgit/how-to-optimize-gemm/aarch64'
g++ -std=c++17 -O2 -g -march=native -ftree-vectorize -c test_MMult.cpp -o test_MMult.o
g++ -std=c++17 -O2 -g -march=native -ftree-vectorize -c MMult_4x4_21.cpp -o MMult_4x4_21.o
g++ -std=c++17 -O2 -g -march=native -ftree-vectorize -c copy_matrix.cpp -o copy_matrix.o
g++ -std=c++17 -O2 -g -march=native -ftree-vectorize -c compare_matrices.cpp -o compare_matrices.o
g++ -std=c++17 -O2 -g -march=native -ftree-vectorize -c random_matrix.cpp -o random_matrix.o
g++ -std=c++17 -O2 -g -march=native -ftree-vectorize -c dclock.cpp -o dclock.o
g++ -std=c++17 -O2 -g -march=native -ftree-vectorize -c REF_MMult.cpp -o REF_MMult.o
g++ -std=c++17 -O2 -g -march=native -ftree-vectorize -c print_matrix.cpp -o print_matrix.o
g++ test_MMult.o MMult_4x4_21.o copy_matrix.o compare_matrices.o random_matrix.o dclock.o REF_MMult.o print_matrix.o -lm \-o test_MMult.x
make[2]: Leaving directory '/home/ywc/HPC/how-to-optimize-gemm-fromgit/how-to-optimize-gemm/aarch64'
make[1]: Leaving directory '/home/ywc/HPC/how-to-optimize-gemm-fromgit/how-to-optimize-gemm/aarch64'
export OMP_NUM_THREADS=1
export GOTO_NUM_THREADS=1
echo "version = 'MMult_4x4_21';" > output_MMult_4x4_21.m
./test_MMult.x >> output_MMult_4x4_21.m
cp output_MMult_4x4_10.m output_old.m
cp output_MMult_4x4_21.m output_new.m
三、解析此过程
3.1 make是什么
在 Linux 中,make 是一个构建自动化工具,主要用于管理和自动化软件编译的过程。它通过读取 Makefile 文件中的规则和依赖关系,帮助用户高效地构建和管理项目。
若在终端直接输入一个make $(target),运行步骤是这样的
1.读取makefile
- make会在当前目录中查找名为Makefile或makefile(以下称makefile)的文件,并读取其内容,没有就会报错
2.解析目标
- make会查找makefile文件中
3.检查依赖关系
- 对于指定的target,make会检查其依赖项,如果target存在依赖项,make会检查这些依赖文件的最后修改时间;如果任何依赖项比目标更新(即依赖项的修改时间晚于目标),则make会认为目标需要重新构建
4.执行命令
- 如果目标需要更新,make会执行与该目标关联的命令。这些命令通常在Makefile中以缩进的方式列出。这些命令会在新的Shell环境中执行。
5.重复过程
- 对于每个依赖项,make会递归地重复步骤3和4,确保所有依赖项都被正确构建。
6.处理伪目标
- 如果指定的目标是一个伪目标(如clean),make直接执行其定义的命令,无需检查任何依赖关系。
7.完成构建
- 一旦所有目标和依赖项都被处理,make会完成执行,并返回到终端。
注:在 Makefile 中,伪目标(或称伪命令)是指不对应于实际文件的目标。它们通常用于执行特定的任务,如清理中间文件、安装程序等。伪目标的一个常见示例是 clean。
首先是在终端make run启动项目
可以看到makefile中的run
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。