实现后的项目放在 github 上,链接如下:
README
CM-tool
Code monitoring tool , which is created to monitor the operation of the optimization code and the base code
代码监控工具 ,创建该工具是为了监控优化代码和基本代码的运行情况
如果您要下载此文件的话,点击右上角的code-download即可
但是!根据我多年的经验,直接下载可能很不稳定,会花费您大量珍贵的时间
根据我多年的经验
您可以在下载之前先点击右上角的五角星
五角星变黄之后就说明您的网速很好,这时候再点击下载的话就可以很快的下载下来
【嘻嘻,手动狗头】
咳咳【正声】
还是不开玩笑了,说一下创建这个小小小项目的原因:
PS:下面先写一些流水账,后面再去进行语言的修饰
- 本人目前在学习cuda和mpi,但是由于互联网上没有有效检测二者学习情况的练习,所以我就自己写代码实现学习当中的产生的一些小想法【比如简单向量运算、简单矩阵乘的优化】但是代码写完之后,尽管能够运行,但是没有像luogu那样的oj平台,无法得知自己代码是否正确,更别说得到对应优化倍率以此来得到直观反馈。于是我就想写一个项目,依据baseline去判断优化后的程序计算结果是否正确,再把指定的两个程序(一个是baseline,一个是优化的程序【期望一个是.cpp,另一个是.cu】)的运行时间给出来,之后计算得出优化倍率,实现判断练习的程序是否正确、得出产生的优化倍率的想法,并从这些结果中获得学习中的(正向)反馈,实现以后更有passion的学习。
- 目前在团队新生学习路径中,也缺少类似这样的学习成果检测的东西,而这类东西的缺少对新生的学习而言是很不好的,【只是无目的的学习,没有项目的操作。有了项目的实操,也不知道自己写的优化代码结果是否正确,更不能直观看到优化代码产生的优化速率,因此无法产出正反馈激励学习,甚至还会因为无目的的学习和几乎只有负面的反馈而心生怯意,导致学习效率和学习欲望下降(别问我是怎么知道的,咳咳)】,希望我能把我想法实现,为以后团队的建设贡献小小的力量
- 这个项目
可能对佬们来说很简单,但是对与一个初入代码世界的新手来说难度适中(甚至还有点难?),并且是可以预见到,能够依托于这个项目学到很多知识【例如项目的整体规划、项目文件的大致分类、CMake、git指令、push操作、脚本构建…(不过我目前学的还是很浅陋)】,因此我想自己写下这个项目,再把这个项目分享给我的一个朋友【或者可能的,以后团队的后来人】,去引导他【们】学会这些东西
PS:项目的初始版本参考团队中杨队的特招题【默默感谢】
待实现的想法:
写一个项目,把指定的两个程序(一个是baseline,一个是优化的程序【期望一个是.cpp,另一个是.cu】)的运行时间给出来,然后计算得出优化倍率,并且依据baseline去判断优化后的程序计算结果是否正确
like特招题
那么我该如何实现这些设想呢?
规划
目前,我有SRQ作为蓝本参考
可以询问AI获取大体方向
目前我掌握的知识有限,所以要实现这个项目肯定要学习一些知识的
分析
先去剖析这个项目
- 需要计算两个程序的运行时间
需要学习记录时间的API【好像cuda有内置的时间记录api,可以学习下这个】 - 需要写一个函数对比baseline和优化程序最终结果,输出优化程序正确与否
- 需要一个除法计算输出最后的加速比
为了使得项目更加简洁,还需要 - 写一个函数储存随机生成的矩阵数据
注意:baseline和优化程序要使用相同的一个数据,方便比较最终的结果
进行宏定义,固定全局变量SIZE(矩阵大小)
【先写个简单的,长宽一致,但是大小可变 - 还要固定baseline和优化程序函数名字及部分参数,使这个项目具有可移植性
为了链接整个项目的文件,还需要 - 学习CMake指令
- .sh脚本语言
项目梳理
项目大致文件:
需要做的东西:
|_ project_name |_ Baseline.cpp -储存c++下的基本串行实现
|_ optimized_code.cu -储存cuda下的并行实现 |_ datebase.hpp -储存原始数据
|_ examination.cpp -检查optimized_code与Baseline结果是否一致 |_ Rate.cpp -计算加速比【可不单列文件,好像可以直接在.sh里面计算输出】
|_ main.cpp -主函数,统筹函数的运行 |_ built -储存makefile文件
|_ CMakeLists.txt -进行项目构建
|_ run.sh -脚本文件,简化命令
首先先是规划了一下项目的整体结构,明确需要哪些文件,每个文件需要做什么,然后总结需要学习的东西,最后去学习和完成项目
学习CMake
开启项目
完成初始代码【使用杨队的框架】
通过这个小项目,我的预期性成果为:
项目构建流程的熟悉
基本CMake的实现和掌握【为后面的进阶学习打下底子】
初次开源尝试
遇到的问题
Q:
为什么我在build目录下执行cmake ..指令运行在build上级目录的CMakeLists.txt文件后没有在build目录生成对应的makefile文件
因为最开始已经在build上级目录(实验)生成了makefile文件,新命令不会生成文件
Q:为什么我CMake之后再去make会有报错【观察报错,现实头文件未有链接上去】
为什么会一直报错?~ git bash $ mingw32-make [ 20%] Building CXX object CMakeFiles/app.dir/datebase.cpp.obj D:\a_study\code_vs\project_name\datebase.cpp: In function ‘void random_matrix(int, int, float*, int)’: D:\a_study\code_vs\project_name\datebase.cpp:22:19: error: ‘C’ cannot be used as a function C(i, j) = 2.0 * (float)drand48() – 1.0; ^ D:\a_study\code_vs\project_name\datebase.cpp:22:36: error: ‘drand48’ was not declared in this scope C(i, j) = 2.0 * (float)drand48() – 1.0; ^~~ D:\a_study\code_vs\project_name\datebase.cpp:22:36: note: suggested alternative: ‘srand’ C(i, j) = 2.0 * (float)drand48() – 1.0; ^~~~~
srand
mingw32-make[2]: *** [CMakeFiles\app.dir\build.make:91: CMakeFiles/app.dir/datebase.cpp.obj] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/app.dir/all] Error 2
mingw32-make: *** [Makefile:90: all] Error 2
不都是宏定义了的吗!
发现一个很大的问题,我学习的那些知识都是基于linux系统的,而我使用的是win,linux和win之间命令有差异....
还有我的win上面没有下载cmake(这个要自己下载)
make的指令也不是单纯的make
而是mingw32-make
### Q:为什么我上午还可以正常运行脚本,但是现在运行出现报错
git bash
# 使用这个脚本时,你需要在bash终端环境中【最简单的bash环境是git bash】
#!/bin/powershell
# 转到build目录下
cd build
# 指定生成器为 MinGW Makefiles
# MinGW是windos 下的一个开发环境
# 所以你使用时需要确保你已经安装了MINBGW
cmake -G "MinGW Makefiles"..
# 使用 mingw32-make 构建项目
mingw32-make
# 运行生成的exe文件
./app
经过排查,问题出现在
`cmake -G "MinGW Makefiles"..`
运行此命令后报错:
$ cmake -G "MinGW Makefiles"..
CMake Error: Could not create named generator MinGW Makefiles..
Generators
Visual Studio 17 2022 = Generates Visual Studio 2022 project files.
Use -A option to specify architecture.
* Visual Studio 16 2019 = Generates Visual Studio 2019 project files.
Use -A option to specify architecture.
Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 11 2012 [arch] = Deprecated. Generates Visual Studio 2012
project files. Optional [arch] can be
"Win64" or "ARM".
Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files.
Optional [arch] can be "Win64" or "IA64".
Borland Makefiles = Generates Borland makefiles.
NMake Makefiles = Generates NMake makefiles.
NMake Makefiles JOM = Generates JOM makefiles.
MSYS Makefiles = Generates MSYS makefiles.
MinGW Makefiles = Generates a make file for use with
mingw32-make.
Green Hills MULTI = Generates Green Hills MULTI files
(experimental, work-in-progress).
Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Ninja Multi-Config = Generates build-<Config>.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles JOM
= Generates CodeBlocks project files.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - MinGW Makefiles = Generates CodeLite project files.
CodeLite - NMake Makefiles = Generates CodeLite project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles = Generates CodeLite project files.
Eclipse CDT4 - NMake Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - MinGW Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
Kate - MinGW Makefiles = Generates Kate project files.
Kate - NMake Makefiles = Generates Kate project files.
Kate - Ninja = Generates Kate project files.
Kate - Unix Makefiles = Generates Kate project files.
Sublime Text 2 - MinGW Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - NMake Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.
Sublime Text 2 - Unix Makefiles
= Generates Sublime Text 2 project files.
CMake Warning:
No source or binary directory provided. Both will be assumed to be the
same as the current working directory, but note that this warning will
become a fatal error in future CMake releases.
这就很奇怪咯?!我上午都可以运行,为什么下午就不能了呢….
奶奶的,这不是支持MinGW Makefiles吗?为什么还是构建不了啊啊啊啊啊啊啊啊啊啊啊啊啊
【小记】
当日晚 7:23
我本是抱着万死无悔的坚定信念,哪怕环境被污染也要重新下载一遍MINGW【以此来验证上述的问题是否是mingw相关的文件存在一些问题【因为我没有写环境配置日志,所以也不知道自己的环境是从哪里配的,有没有配置少,版本有没有问题…】【以后就知道了,配置环境一定要留下日志(以及配置文档,或者配置教程)】
可惜我不甘心不明不白就被这个错误打倒!
于是我分析了下报错信息,发现下面给出的建议有MINWG Makefiies的选项,于是我就copy了一份,然后自己手写了一遍命令,最后….成功运行
【黑人问号emoji】
短暂的一瞬间,狂喜、疑惑、懵逼、不敢置信等情绪如幻灯片闪过,心里万般复杂。
“啊???勒浪开又过了呀…”
然后我比对刚刚写下的代码和我md文档中的代码,发现…
”我c!!!,我文档这里怎么没有打空格!!!….“
这一瞬间,我被我的聪明的脑子给蠢笑了
To be continue…Q:
为什么运行
mingw32-make
之后报错main函数redefined?
git bash
ASUS@LAPTOP-SPPQSEGM MINGW64 /d/a_study/code_vs/CM-tool/project_not_for_cuda 2.0/build (main)
$ mingw32-make
[ 16%] Building CXX object CMakeFiles/app.dir/based_code/examination.cpp.obj
[ 33%] Building CXX object CMakeFiles/app.dir/based_code/main.cpp.obj
[ 50%] Building CXX object CMakeFiles/app.dir/scr/optimized_code.cpp.obj
[ 66%] Linking CXX executable app.exe
CMakeFiles\app.dir/objects.a(CMakeCXXCompilerId.cpp.obj):CMakeCXXCompilerId.cpp:(.text+0x0): multiple definition of `main'
CMakeFiles\app.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x54): first defined here
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [CMakeFiles\app.dir\build.make:167: app.exe] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/app.dir/all] Error 2
mingw32-make: *** [Makefile:90: all] Error 2
like this:
我很疑惑,这个版本就改了下**cmake**,怎么出现代码层面的redefined呢?
于是我**粗略看了下报错**【因为太多英文我懒得仔细看】打算去查找是哪个文件出了问题
我先关注到的是我的main.cpp文件(因为我只在这个文件中定义了main函数的),没有发现问题
再问问AI,按照AI的建议又重新搜查了整个项目的.cpp文件,没有发现问题
此时,【黑人问号emoji???】
这次我还是蠢蠢的,死劲去问AI该怎么办,然后没有收获
我有点小小的抓狂了
在整个项目文件中搜索含有main的.cpp文件,准备抓住罪魁祸首然后一雪前耻
【指定目录下搜索技能get,代码世界生存能力++;】
然后找到罪魁祸首了…是cmake构建项目生成的.cpp文件
好家伙!
好消息:找到了,坏消息:看不懂
呃呃呃…
这次我学聪明了,**不去傻傻询问AI这个代码块有什么用,而是询问AI这个文件的作用是什么,是否会造成main函数的定义冲突**
….
然后知道了一些信息,但是还是不知道下一步该怎么做【有点小抓狂】
然后我抱着死马当活马医的心态,把这一小行报错丢给egde搜索….
靠,还真是,有前辈遇见过这个问题…
再加上前面胡乱乱撞搜集到的一些信息,
SO,我彻底明白了,这个问题出现的原因是:
>`file(GLOB_RECURSE cpp_files “*.cpp”)`
>再加上错误的文件结构
cmake会将config【配置】产生的中间文件保存在自动生成的build目录下,这些文件中也有后缀是.h和.cpp的,其中就有一个叫CMakeCXXCompilerId.cpp,它里有一个cmake自动生成的main函数。我们自己写的代码里也有一个main函数。上述指令使用了GLOB_RECURSE选项,会在当前目录递归查找所有后缀名为.cpp的源文件,然后就会找到两个包含main函数的cpp文件拿去编译,因此会报错redefined
Q:git push显示没有连接上github
报错如下:
git bash
ASUS@LAPTOP-SPPQSEGM MINGW64 /d/a_study/code_vs/CM-tool (main)
$ git push
fatal: unable to access 'https://github.com/ziyang22/CM-tool.git/': Failed to connect to github.com port 443 after 21067 ms: Could not connect to server
解决措施:
clash上开启TUN模式
原因:
梯子在规则模式的时候会判断用户访问的页面来自哪里,对应选择流量发放的区域。
例如:访问github网站,则使用外网的流量,访问QQ,则使用国内的流量
而开启clash上面的TUN模式的话,就相当于开了一张外网的虚拟流量卡,所有的流量都会用外网流量
【因为对相关术语不了解,所以瞎编的两个“国内流量”和“国外流量”名词,目的是表达访问不同网址所需要不同的流量(或者是ip地址?)】
> PS:这个方法不能一直有效,刚刚还是出这个网络问题了….
Q:基本提示词摘录
cmake啥啥遍历的复现和学习
终端报错+
这个报错是什么意思,该如何解决?
CMake版本1.0
# 制定只用的cmake的最低版本
cmake_minimum_required(VERSION 3.0)
# 定义工程名称
project(CALC)
include_directories(${PROJECT_NAME}/Head)
# 定义工程会生成可执行程序
# add_executable(可执行程序名 源文件名称)
add_executable(app Baseline.cpp datebase.cpp examination.cpp main.cpp)
add
一些重要指令
cmake -G "MinGW Makefiles" ..
mingw32-make
偶尔的碎碎念
24/12/6
OK,基础的cpp与cpp之间的项目比较大致完成
但核心内容还是依托的杨队的代码,虽然成功实现部分想法,但是正反馈不多
接下来需要:
总结到目前阶段我所遇到的问题和如何解决的【问题产生的原因是什么,为什么能够去解决?】
需要回看AI的历史记录
去优化项目结构,比如,了解src等基本目录的作用,再以此进行文件的分类
文件分类后目录层级会发生改变,大概率需要继续CMake的学习
然后再去尝试实现cpp与cuda的实现【终极目标】
先试一下项目的建立吧
先把这个粗陋的项目交上去,后面一代代更新也能记录下来