C#怎样让不同的线程运行在不同的CPU上来提高运行效率?

花开花折 2020-02-25 02:48:25

1:假如单独调用FindShapeModel()方法执行所需要时间为100mms ;那我用多线程调用FindShapeModel()\FindShapeModel1()所用的时间应该也是100ms 左右,但实际测试发现会大于100*2ms ,偶尔有100ms左右的情况出现。
2:求解原因,代码中有设置让线程运行在不同的CPU上,但根据实没时间,好像还是运行在同一个CPU上。

3:FindShapeModel()\FindShapeModel1()方法内容一样的,只是名称不一样。
4:硬件配置 intel core(TM)-i7-7700 CPU



private void FindShapeModel()
{
Thread.BeginThreadAffinity();

IntPtr handle = GetCurrentThread();
int id = Thread.CurrentThread.ManagedThreadId;
uint id1 = GetCurrentThreadId();

UIntPtr rtn = SetThreadAffinityMask(handle, new UIntPtr(0x000F));
uint rtn1 = GetLastError();
QueryPerformanceCounter(ref time[15]);
isFinish[0]= FindShapeModel(hv_ModelID,ho_Image);

Thread.EndThreadAffinity();

}

private void FindShapeModel1()
{
Thread.BeginThreadAffinity();

IntPtr handle = GetCurrentThread();
int id = Thread.CurrentThread.ManagedThreadId;
uint id1 = GetCurrentThreadId();

UIntPtr rtn = SetThreadAffinityMask(handle, new UIntPtr(0x0001));
uint rtn1 = GetLastError();
FindShapeModel1(hv_ModelID, ho_Image1);

Thread.EndThreadAffinity();

}



MyThread[0] = new Thread(new ThreadStart(FindShapeModel));
MyThread[0].Start();

MyThread[1] = new Thread(new ThreadStart(FindShapeModel1));
MyThread[1].Start();




...全文
1576 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
花开花折 2020-02-27
  • 打赏
  • 举报
回复
引用 15 楼 xiaoxiangqing 的回复:
Parallel才是并行,可以分不同cpu运行


1:需要怎样设置,请教一下?
xiaoxiangqing 2020-02-27
  • 打赏
  • 举报
回复
Parallel才是并行,可以分不同cpu运行
花开花折 2020-02-26
  • 打赏
  • 举报
回复
引用 2 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:
只要没有同步,不同的线程是会自动被调度到不同的cpu上的。
考虑到cpu内核的亲缘性(比如同一个内核上的两个逻辑处理器的资源竞争,或者两个不同的CCX上的核心的通讯开销),让操作系统去调度,效率更好。


1:确定没有同步;
2:实际测试运行时间感觉两个线程就是运行在一个CPU上的啊?
3:在线程运行时是否可以查询当前线程运行在那个CPU上吗??
花开花折 2020-02-26
  • 打赏
  • 举报
回复
引用 3 楼 github_36000833 的回复:
i7-7700有4个核。从概率上说,即使你没有手动分配CPU,在不同CPU上运行的机会还是很高的。
我更怀疑你的两个线程的具体实现存在竞态(存在互相影响)。

题外话,SetThreadAffinityMask的最后一个参数用的是bit vector。0x000F的二进制位为0b_1111,即允许运行在core 1,2,3,4中的任意一个。如果你要特别设置运行在某个Core上,则要写成0x1,0x2,0x4,或0x8。


1:两个线程之间确定没有竞争关系;
2:实际测试两个线程运行时间,感觉就是两个线程在同一个CPU上交替运行的。
3: 不知为啥我调用GetCurrentThread()获取的句柄都是-2,很奇怪?

github_36000833 2020-02-26
  • 打赏
  • 举报
回复
i7-7700有4个核。从概率上说,即使你没有手动分配CPU,在不同CPU上运行的机会还是很高的。 我更怀疑你的两个线程的具体实现存在竞态(存在互相影响)。 题外话,SetThreadAffinityMask的最后一个参数用的是bit vector。0x000F的二进制位为0b_1111,即允许运行在core 1,2,3,4中的任意一个。如果你要特别设置运行在某个Core上,则要写成0x1,0x2,0x4,或0x8。
花开花折 2020-02-26
  • 打赏
  • 举报
回复
引用 11 楼 的回复:
[quote=引用 6 楼 花开花折 的回复:]
[quote=引用 1 楼 的回复:]
你搜索一下 并发和并行的区别。
简单来说,并发就是你说的多线程,只是同一个时间点,大家轮流执行。
并行的话,才是你需要的意思。
所以你可以使用 Parallel



Parallel.Invoke(() =>
{
FindShapeModel()
},

() =>
{
FindShapeModel1()
}
);


1:我是这样调用的,但测试发现跟用多线程一样,运行效率没有提高啊?[/quote]
如果你的方法里是IO操作,那是不能并行了。
你可以尝试使用IO异步操作来缩短时间。这个和IO争用有关系。
FileStream stream = new FileStream("1.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 1024, FileOptions.Asynchronous | FileOptions.WriteThrough);
[/quote]

1:没有IO操作,只是单纯的内存复制Copy,释放操作。循环操作80次;
花开花折 2020-02-26
  • 打赏
  • 举报
回复
我用GetCurrentProcessorNumber()获取的两个线程中CPUID如下,证明两个线程有时确实运行在同一个CPU下面;

FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:716
FindShapeModel1:CPUID: 1 Time: 2020-02-26 17:25:25:719
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:721
FindShapeModel1:CPUID: 6 Time: 2020-02-26 17:25:25:723
FindShapeModel0:CPUID: 3 Time: 2020-02-26 17:25:25:726
FindShapeModel1:CPUID: 6 Time: 2020-02-26 17:25:25:727
FindShapeModel0:CPUID: 7 Time: 2020-02-26 17:25:25:730
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:731
FindShapeModel0:CPUID: 6 Time: 2020-02-26 17:25:25:734
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:736
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:738
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:740
FindShapeModel0:CPUID: 4 Time: 2020-02-26 17:25:25:743
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:744
FindShapeModel0:CPUID: 1 Time: 2020-02-26 17:25:25:747
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:748
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:751
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:753
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:756
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:757
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:760
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:761
FindShapeModel0:CPUID: 3 Time: 2020-02-26 17:25:25:764
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:765
FindShapeModel0:CPUID: 1 Time: 2020-02-26 17:25:25:768
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:769
FindShapeModel0:CPUID: 4 Time: 2020-02-26 17:25:25:772
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:25:774
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:776
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:778
FindShapeModel0:CPUID: 1 Time: 2020-02-26 17:25:25:780
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:782
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:785
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:787
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:789
FindShapeModel1:CPUID: 1 Time: 2020-02-26 17:25:25:791
FindShapeModel0:CPUID: 3 Time: 2020-02-26 17:25:25:793
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:795
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:797
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:25:799
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:801
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:803
FindShapeModel0:CPUID: 7 Time: 2020-02-26 17:25:25:806
FindShapeModel1:CPUID: 6 Time: 2020-02-26 17:25:25:808
FindShapeModel0:CPUID: 6 Time: 2020-02-26 17:25:25:810
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:812
FindShapeModel0:CPUID: 4 Time: 2020-02-26 17:25:25:814
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:818
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:820
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:823
FindShapeModel0:CPUID: 1 Time: 2020-02-26 17:25:25:825
FindShapeModel0:CPUID: 3 Time: 2020-02-26 17:25:25:829
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:25:832
FindShapeModel0:CPUID: 3 Time: 2020-02-26 17:25:25:834
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:835
FindShapeModel0:CPUID: 1 Time: 2020-02-26 17:25:25:838
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:839
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:842
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:843
FindShapeModel0:CPUID: 4 Time: 2020-02-26 17:25:25:846
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:847
FindShapeModel0:CPUID: 5 Time: 2020-02-26 17:25:25:849
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:850
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:853
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:854
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:856
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:858
FindShapeModel0:CPUID: 3 Time: 2020-02-26 17:25:25:860
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:861
FindShapeModel0:CPUID: 4 Time: 2020-02-26 17:25:25:864
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:866
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:869
FindShapeModel0:CPUID: 7 Time: 2020-02-26 17:25:25:873
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:874
FindShapeModel0:CPUID: 7 Time: 2020-02-26 17:25:25:876
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:877
FindShapeModel0:CPUID: 1 Time: 2020-02-26 17:25:25:880
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:881
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:883
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:884
FindShapeModel0:CPUID: 1 Time: 2020-02-26 17:25:25:887
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:888
FindShapeModel0:CPUID: 7 Time: 2020-02-26 17:25:25:890
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:892
FindShapeModel0:CPUID: 7 Time: 2020-02-26 17:25:25:893
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:895
FindShapeModel0:CPUID: 6 Time: 2020-02-26 17:25:25:897
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:899
FindShapeModel0:CPUID: 5 Time: 2020-02-26 17:25:25:901
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:25:903
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:904
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:25:906
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:908
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:25:910
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:911
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:25:914
FindShapeModel0:CPUID: 6 Time: 2020-02-26 17:25:25:915
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:917
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:918
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:921
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:922
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:924
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:925
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:928
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:928
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:931
FindShapeModel0:CPUID: 3 Time: 2020-02-26 17:25:25:932
FindShapeModel1:CPUID: 6 Time: 2020-02-26 17:25:25:934
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:936
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:938
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:939
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:941
FindShapeModel0:CPUID: 6 Time: 2020-02-26 17:25:25:943
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:945
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:946
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:948
FindShapeModel0:CPUID: 4 Time: 2020-02-26 17:25:25:950
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:952
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:953
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:955
FindShapeModel0:CPUID: 4 Time: 2020-02-26 17:25:25:957
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:959
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:960
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:25:962
FindShapeModel0:CPUID: 4 Time: 2020-02-26 17:25:25:964
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:966
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:967
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:969
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:970
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:973
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:974
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:25:976
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:978
FindShapeModel1:CPUID: 0 Time: 2020-02-26 17:25:25:980
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:981
FindShapeModel1:CPUID: 6 Time: 2020-02-26 17:25:25:983
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:984
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:25:987
FindShapeModel0:CPUID: 6 Time: 2020-02-26 17:25:25:988
FindShapeModel1:CPUID: 2 Time: 2020-02-26 17:25:25:990
FindShapeModel0:CPUID: 6 Time: 2020-02-26 17:25:25:991
FindShapeModel1:CPUID: 3 Time: 2020-02-26 17:25:25:994
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:25:995
FindShapeModel1:CPUID: 3 Time: 2020-02-26 17:25:25:997
FindShapeModel0:CPUID: 2 Time: 2020-02-26 17:25:25:998
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:26:001
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:26:002
FindShapeModel1:CPUID: 4 Time: 2020-02-26 17:25:26:005
FindShapeModel0:CPUID: 5 Time: 2020-02-26 17:25:26:006
FindShapeModel1:CPUID: 3 Time: 2020-02-26 17:25:26:008
FindShapeModel0:CPUID: 5 Time: 2020-02-26 17:25:26:010
FindShapeModel1:CPUID: 5 Time: 2020-02-26 17:25:26:012
FindShapeModel0:CPUID: 0 Time: 2020-02-26 17:25:26:014
FindShapeModel1:CPUID: 7 Time: 2020-02-26 17:25:26:016
Robin_Hsu 2020-02-26
  • 打赏
  • 举报
回复
完全不懂,但是学习了!
正怒月神 2020-02-26
  • 打赏
  • 举报
回复
引用 6 楼 花开花折 的回复:
[quote=引用 1 楼 的回复:] 你搜索一下 并发和并行的区别。 简单来说,并发就是你说的多线程,只是同一个时间点,大家轮流执行。 并行的话,才是你需要的意思。 所以你可以使用 Parallel

Parallel.Invoke(() =>
                             {
                                FindShapeModel()
                             },  

                             () =>
                             {
                                 FindShapeModel1()
                             }
                         ); 
1:我是这样调用的,但测试发现跟用多线程一样,运行效率没有提高啊?[/quote] 如果你的方法里是IO操作,那是不能并行了。 你可以尝试使用IO异步操作来缩短时间。这个和IO争用有关系。
FileStream stream = new FileStream("1.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 1024, FileOptions.Asynchronous | FileOptions.WriteThrough);
花开花折 2020-02-26
  • 打赏
  • 举报
回复
引用 7 楼 github_36000833 的回复:
3: 不知为啥我调用GetCurrentThread()获取的句柄都是-2,很奇怪?
A: -2没有问题,它就是所谓的伪句柄,在当前调用的上下文中使用没有问题的。如果要传给其他进程或线程,则要DuplicateHandle,就可以拿到‘真’句柄了。
#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )

在线程运行时是否可以查询当前线程运行在那个CPU上吗??
A: GetCurrentProcessorNumber


线程之间会有影响,只是不同的任务类型,影响大小而已。
比如用两个线程来加快拷贝一个文件,往往效果很差,因为对同一个硬盘的操作,多个操作方反而可能导致更多的磁头移动和定位。
比如用两个线程来进行内存操作,效果不会达到两倍的好,因为一个线程的写可能导致缓存的失效,读可能导致缓存的移除,造成互相踩脚。


1:FindShapeModel(),FindShapeModel1()中比较耗时的只是段重复复制图像到内存中,然后再释放的代码(测试用的),两个图像都是独立的,按理说不应该 缓存的移除,造成互相踩脚啊。
2:我实际应用中同时有5个类似的FindShapeModel()的方法要同时执行,如果开线程运行,那时间就得500ms左右;
3:有没真正意义上的“并行”,也就是实际运行时5个方法一起并行运行????
github_36000833 2020-02-26
  • 打赏
  • 举报
回复

引用 8 楼 圣殿骑士18 的回复:
落伍了,请问下,
BeginThreadAffinity
EndThreadAffinity
SetThreadAffinityMask
是什么作用,怎么从来没用过?


其实用处不大。
头两个是在某些特定情况下,说服宿主不要使用多个原生线程。后一个不用更好,让clr来优化效果一般更好。

理论上托管线程并不需要和原生线程一一对应,比如以前的sqlclr,sql可以调度不同的本地线程来运行同一个托管线程。在这些特殊情况下,如果托管线程里需要用到原生线程的一些特性,就要请求宿主sql不要切换本地线程,这就是BeginThreadAffinity和EndThreadAffinity。

圣殿骑士18 2020-02-26
  • 打赏
  • 举报
回复
落伍了,请问下,
BeginThreadAffinity
EndThreadAffinity
SetThreadAffinityMask
是什么作用,怎么从来没用过?
github_36000833 2020-02-26
  • 打赏
  • 举报
回复
3: 不知为啥我调用GetCurrentThread()获取的句柄都是-2,很奇怪? A: -2没有问题,它就是所谓的伪句柄,在当前调用的上下文中使用没有问题的。如果要传给其他进程或线程,则要DuplicateHandle,就可以拿到‘真’句柄了。 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 ) 在线程运行时是否可以查询当前线程运行在那个CPU上吗?? A: GetCurrentProcessorNumber 线程之间会有影响,只是不同的任务类型,影响大小而已。 比如用两个线程来加快拷贝一个文件,往往效果很差,因为对同一个硬盘的操作,多个操作方反而可能导致更多的磁头移动和定位。 比如用两个线程来进行内存操作,效果不会达到两倍的好,因为一个线程的写可能导致缓存的失效,读可能导致缓存的移除,造成互相踩脚。
花开花折 2020-02-26
  • 打赏
  • 举报
回复
引用 1 楼 的回复:
你搜索一下 并发和并行的区别。
简单来说,并发就是你说的多线程,只是同一个时间点,大家轮流执行。
并行的话,才是你需要的意思。
所以你可以使用 Parallel



Parallel.Invoke(() =>
{
FindShapeModel()
},

() =>
{
FindShapeModel1()
}
);


1:我是这样调用的,但测试发现跟用多线程一样,运行效率没有提高啊?
threenewbee 2020-02-25
  • 打赏
  • 举报
回复
只要没有同步,不同的线程是会自动被调度到不同的cpu上的。
考虑到cpu内核的亲缘性(比如同一个内核上的两个逻辑处理器的资源竞争,或者两个不同的CCX上的核心的通讯开销),让操作系统去调度,效率更好。
正怒月神 2020-02-25
  • 打赏
  • 举报
回复
你搜索一下 并发和并行的区别。 简单来说,并发就是你说的多线程,只是同一个时间点,大家轮流执行。 并行的话,才是你需要的意思。 所以你可以使用 Parallel

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧