小项目的实现
本文最后更新于24 天前,其中的信息可能已经过时,如有错误请发送邮件到zhangweihao22@outlook.com

实现后的项目放在 github 上,链接如下:

CM-tool

README

CM-tool

Code monitoring tool , which is created to monitor the operation of the optimization code and the base code
代码监控工具 ,创建该工具是为了监控优化代码和基本代码的运行情况

如果您要下载此文件的话,点击右上角的code-download即可

但是!根据我多年的经验,直接下载可能很不稳定,会花费您大量珍贵的时间

根据我多年的经验

您可以在下载之前先点击右上角的五角星

五角星变黄之后就说明您的网速很好,这时候再点击下载的话就可以很快的下载下来

【嘻嘻,手动狗头】

咳咳【正声】
还是不开玩笑了,说一下创建这个小小小项目的原因:

PS:下面先写一些流水账,后面再去进行语言的修饰

  1. 本人目前在学习cuda和mpi,但是由于互联网上没有有效检测二者学习情况的练习,所以我就自己写代码实现学习当中的产生的一些小想法【比如简单向量运算、简单矩阵乘的优化】但是代码写完之后,尽管能够运行,但是没有像luogu那样的oj平台,无法得知自己代码是否正确,更别说得到对应优化倍率以此来得到直观反馈。于是我就想写一个项目,依据baseline去判断优化后的程序计算结果是否正确,再把指定的两个程序(一个是baseline,一个是优化的程序【期望一个是.cpp,另一个是.cu】)的运行时间给出来,之后计算得出优化倍率,实现判断练习的程序是否正确、得出产生的优化倍率的想法,并从这些结果中获得学习中的(正向)反馈,实现以后更有passion的学习。
  2. 目前在团队新生学习路径中,也缺少类似这样的学习成果检测的东西,而这类东西的缺少对新生的学习而言是很不好的,【只是无目的的学习,没有项目的操作。有了项目的实操,也不知道自己写的优化代码结果是否正确,更不能直观看到优化代码产生的优化速率,因此无法产出正反馈激励学习,甚至还会因为无目的的学习和几乎只有负面的反馈而心生怯意,导致学习效率和学习欲望下降(别问我是怎么知道的,咳咳)】,希望我能把我想法实现,为以后团队的建设贡献小小的力量
  3. 这个项目可能对佬们来说很简单,但是对与一个初入代码世界的新手来说难度适中(甚至还有点难?),并且是可以预见到,能够依托于这个项目学到很多知识【例如项目的整体规划、项目文件的大致分类、CMake、git指令、push操作、脚本构建…(不过我目前学的还是很浅陋)】,因此我想自己写下这个项目,再把这个项目分享给我的一个朋友【或者可能的,以后团队的后来人】,去引导他【们】学会这些东西

PS:项目的初始版本参考团队中杨队的特招题【默默感谢】

待实现的想法:

写一个项目,把指定的两个程序(一个是baseline,一个是优化的程序【期望一个是.cpp,另一个是.cu】)的运行时间给出来,然后计算得出优化倍率,并且依据baseline去判断优化后的程序计算结果是否正确
like特招题
那么我该如何实现这些设想呢?

规划

目前,我有SRQ作为蓝本参考
可以询问AI获取大体方向
目前我掌握的知识有限,所以要实现这个项目肯定要学习一些知识的

分析

先去剖析这个项目

  1. 需要计算两个程序的运行时间
    需要学习记录时间的API【好像cuda有内置的时间记录api,可以学习下这个】
  2. 需要写一个函数对比baseline和优化程序最终结果,输出优化程序正确与否
  3. 需要一个除法计算输出最后的加速比
    为了使得项目更加简洁,还需要
  4. 写一个函数储存随机生成的矩阵数据
    注意:baseline和优化程序要使用相同的一个数据,方便比较最终的结果
    进行宏定义,固定全局变量SIZE(矩阵大小)
    【先写个简单的,长宽一致,但是大小可变
  5. 还要固定baseline和优化程序函数名字及部分参数,使这个项目具有可移植性
    为了链接整个项目的文件,还需要
  6. 学习CMake指令
  7. .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的实现【终极目标】

先试一下项目的建立吧
先把这个粗陋的项目交上去,后面一代代更新也能记录下来

2024/12/19 创建
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
Copyright 2025-2025 @ Ziyang
Running Time days H M S