背景:在写论文,需要处理较大的矩阵,因此想通过分块矩阵用多线程分别计算。
对于如何设置线程数,看到一篇博客: https://www.cnblogs.com/javalyy/p/10930330.html,上面提到:
最佳线程数目 = ((线程等待时间+线程 CPU 时间)/线程 CPU 时间 )* CPU 数目
博主举例:我们的服务器 CPU 核数为 4 核,一个任务线程 cpu 耗时为 20ms,线程等待(网络 IO 、磁盘 IO )耗时 80ms,那最佳线程数目:( 80 + 20 )/20 * 4 = 20 。也就是设置 20 个线程数最佳。
问题:我去搜索无法搜到想要的内容,请问使用 C#如何查看我电脑的 线程等待时间、线程 CPU 时间呢?可以用哪个方法获取,或者提供一个关键字我去搜索。
说明:使用几个线程其实无所谓,主要是要有个理论依据。
1
GoLand 2020-11-19 10:24:09 +08:00
这东西没有很精确的值,一般默认设成核数,你要是想压榨算力,可以慢慢调,加几个减几个然后测试,调到性能最佳点就是你这个“程序”的最佳线程数。
|
2
ysc3839 2020-11-19 10:27:33 +08:00 via Android
这种 CPU 运算的情况,线程是一直在运行的,没有等待 IO,所以“线程等待时间”是 0 。
|
3
no1xsyzy 2020-11-19 10:31:18 +08:00
CPU 密集型运算没有等待时间
压榨每一滴算力需要实测,因为上述也只是非常粗略的估计,何况实际情况下还会产生别的问题(比如缓存命中率的问题)。 |
4
lower 2020-11-19 10:34:14 +08:00
结束和开始时的时间相减
|
5
132hong OP |
6
renmu123 2020-11-19 10:42:31 +08:00 via Android
CPU 密集型一般就设置成 cpu 核数
|
7
rihkddd 2020-11-19 10:50:12 +08:00
如果单纯的想快,最好用已经写好的矩阵计算库,不止并行会影响计算速度,例如缓存命中,算法,指令优化带来的提升都会很大。
如果你论文研究的就是矩阵计算,应该对上述问题都有了解,简单来说矩阵计算基本上没有 IO 。 |
8
imn1 2020-11-19 11:04:22 +08:00
C#是写 GUI 么,还是 CLI ?
GUI 加个控件可选呗,默认=CPU 数 |
9
wangritian 2020-11-19 14:11:17 +08:00
如果矩阵是整体加载到内存后再分块计算,也就是线程中没有磁盘 IO,那设置成 CPU 逻辑核心数就好了
如果你的矩阵分块保存成了多个文件,线程内有读取文件操作,就需要按公式定 |
10
paoqi2048 2020-11-19 14:34:01 +08:00
先设置成 processor 数量,后面根据测试情况调整
|
11
wysnylc 2020-11-19 15:10:33 +08:00
用二分法慢慢调
操作步骤为:设置 200 记录运行时间;设置 100 记录运行时间,设置 300 记录运行时间.如果 100 时间最少则设置 50 和 150,依次类推不到 10 次就可以定位到个位数 |
12
132hong OP |
14
hdfg159 2020-11-19 22:03:51 +08:00 via Android
这个没有标准的公式吧,自己看看任务主 IO 还是主 CPU,然后自己调,然后测试跑一下看看处理效率比。
|
15
lxilu 2020-11-19 23:17:30 +08:00 via iPhone
较大是多大,百万乘百万?
|
16
laminux29 2020-11-19 23:28:05 +08:00
公开一个小技巧,这个问题其实有一款图形化模拟器,名字叫:Factorio 。什么并行串行单核多核分布式缓存瓶颈等问题,在这款模拟器里都能实现图形化展示。
|
17
laminux29 2020-11-19 23:29:06 +08:00
你把这款模拟器从头到尾玩一遍,就相当于从单核单机时代,到现在分布式时代,全部走了一遍。以后再遇到这种问题,脑子里就容易有设计思路与处理画面了。
|
19
Chinsung 2020-11-20 17:50:31 +08:00
等待时间这些,linux 上可以通过命令和工具查看,windows 不清楚。
不过我感觉 CPU 密集型,2*CPU 到 CPU+1 去慢慢试就好了 |