makefile的运行(结合终端输出反馈)

一个基于arm架构的gemm项目


前言

我的思路就是,从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    := -lm

UTIL       := copy_matrix.o \
              compare_matrices.o \
              random_matrix.o \
              dclock.o \
              REF_MMult.o \
              print_matrix.o

TEST_OBJS  := test_MMult.o $(NEW).o 

%.o: %.cpp
	$(CC) $(CFLAGS) -c $< -o $@

all: 
	make clean;
	make test_MMult.x

test_MMult.x: $(TEST_OBJS) $(UTIL) parameters.h
	$(LINKER) $(TEST_OBJS) $(UTIL) $(LDFLAGS) \
        $(BLAS_LIB) -o $(TEST_BIN) $@ 

run:	
	make all
	export OMP_NUM_THREADS=1
	export GOTO_NUM_THREADS=1
	echo "version = '$(NEW)';" > output_$(NEW).m
	./test_MMult.x >> output_$(NEW).m
	cp output_$(OLD).m output_old.m
	cp output_$(NEW).m output_new.m

clean:
	rm -f *.o *~ core *.x

cleanall:
	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提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值