双cpu中线程数量与运行效率不一致

hztj2005 2012-09-22 11:59:42
下面是编程对汉语语句进行语法分析,测试文件语句数量: 398002,文件大小9m

硬件是:双 E5-2670 cpu ;每cpu 八核,16线程(任务管理器每cpu显示16个小核,共32个小核)

内存32G,实际使用仅7G。

omp_set_num_threads设置线程数量

#pragma omp for schedule(static,80)//给分配工作量

一、SetThreadAffinityMask绑定;


线程数量:1,执行用时 128732秒 绑定0核(任务管理器显示绑定)

线程数量:2,执行用时 110043秒 绑定0-1核(任务管理器显示绑定)

线程数量:4,执行用时 111837秒 绑定0-3核(任务管理器显示绑定)

线程数量:8,执行用时 142554秒 绑定0-7核(任务管理器显示绑定)

线程数量:16,执行用时 205469秒 绑定0-15核(任务管理器显示绑定)

线程数量:32,绑定0-31核未测试

二、不绑定;

线程数量:1,执行用时 122726秒 不设绑定

线程数量:2,执行用时 99654秒 不设绑定

线程数量:4,执行用时 114239秒 不设绑定

线程数量:8,执行用时 156469秒 不设绑定

线程数量:16,执行用时 236576秒 不设绑定

线程数量:32,执行用时 369644秒 不设绑定

线程数量:64,执行用时 531136秒 不设绑定



运行最快竟然是2线程,如何解释?

...全文
375 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztj2005 2012-09-27
  • 打赏
  • 举报
回复
用VTune发现 4线程是 L2 replacement 是 45% ,这个词语是命中率 还是 失效率,不管怎样,都很低了。
hztj2005 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
CPU的不同核心对同一地址访问,只要有一个进行了写操作,就会造成缓存失效,极大地降低效率。不同的CPU,内部缓存没有同步机制,对内存访问冲突更多。

[/Quote]

为了防止保存结果写操作的互相干预,我给每个线程定义了一个链表,是这样定义的:

list <Yuju> yujulist[4]; //这样定义了4个链表,4个线程个用一个链表进行pushback

我想这样写操作应该不需要同步吧?



hztj2005 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
看了楼主和4楼的测试方案,感想如下:

而楼主的给的数据较模糊,语法验证牵涉到资源协调和互相等待么?
我举个例子多线程操作一个文件。
第一个线程处理80行,时间为a,第二个线程也处理 80行 时间为b
谁快??
第二个,第二个还要找第一个处理的80行后的位置,再处理呢。
总的处理时间……
[/Quote]

每个语句分析语法是不相关的。

每个线程独立分析指定的语句,就是说没有资源协调和互相等待.

不过代码比较复杂,我也不能完全肯定。

是否有方法观察,线程中是否有资源协调和互相等待现象?

kyotrue 2012-09-24
  • 打赏
  • 举报
回复
CPU的不同核心对同一地址访问,只要有一个进行了写操作,就会造成缓存失效,极大地降低效率。不同的CPU,内部缓存没有同步机制,对内存访问冲突更多。

编程时优化不好的话,肯定会造成线程越多速度越慢的。

还有,绑定时不要绑定0核,OS默认都是优先用0核去运行程序的,这样受其他进程的影响很大。
hztj2005 2012-09-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
线程同步的开销引起的?
[/Quote]

我没有写同步代码,是用omp_set_num_threads设置的线程数量。

所以呢,由于不知cpu内部如何运行,只能猜测和尝试各种方案。

Gloveing 2012-09-23
  • 打赏
  • 举报
回复
线程同步的开销引起的?
看不见的裂痕 2012-09-23
  • 打赏
  • 举报
回复
楼上写错了,呵呵。。是a快。因为a不用找位置,打开就直接处理了。
看不见的裂痕 2012-09-23
  • 打赏
  • 举报
回复
看了楼主和4楼的测试方案,感想如下:

4楼的测试方案不牵涉线程间资源互相协调,都是寄存器保存一个总量。这个是完全发挥CPU的效率的。

而楼主的给的数据较模糊,语法验证牵涉到资源协调和互相等待么?
我举个例子多线程操作一个文件。
第一个线程处理80行,时间为a,第二个线程也处理 80行 时间为b
谁快??
第二个,第二个还要找第一个处理的80行后的位置,再处理呢。
总的处理时间为b
tcige 2012-09-23
  • 打赏
  • 举报
回复
因为你双cpu就构成了numa

分配内存需要用VirtualAllocExNuma
hotpos 2012-09-23
  • 打赏
  • 举报
回复
没有服务器, 拿自己的台式机测试了下. 代码如下.

int IsPrime(long n)
{
if (n < 2)
return 0;

for (int i=2; i<n; i++)
{
if ((n%i) == 0)
return 0;
}

return 1;
}

DWORD WINAPI PrimeFun(LPVOID param)
{
long num;
volatile long* pNum = (volatile long*)param;

DWORD r = 0;
while ((num = InterlockedIncrement(pNum)) < 500000)
{
r += IsPrime(num);
}

return r;
}

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hTreads[12] = {0};

for (int i=1; i<13; i++)
{
volatile long num = 0;
for(int j=0; j<i; j++)
{
hTreads[j] = CreateThread(NULL, 0, PrimeFun, (LPVOID)&num, 0, NULL);
}

DWORD t1 = GetTickCount();
WaitForMultipleObjects(i, hTreads, TRUE, -1);

DWORD r = 0;
for (int j=0; j<i; j++)
{
DWORD v = 0;
GetExitCodeThread(hTreads[j], &v);

r += v;
}

printf("%2d个线程, 耗时 %dms, 共有%d个质数\n", i, GetTickCount() - t1, r);
}

return 0;
}


用最粗暴的方式求质数的个数.
在单I5 2320上采集了两组数据.


1个线程, 耗时 43837ms, 共有41538个质数
2个线程, 耗时 22152ms, 共有41538个质数
3个线程, 耗时 14851ms, 共有41538个质数
4个线程, 耗时 11372ms, 共有41538个质数
5个线程, 耗时 11357ms, 共有41538个质数
6个线程, 耗时 11341ms, 共有41538个质数
7个线程, 耗时 11216ms, 共有41538个质数
8个线程, 耗时 11342ms, 共有41538个质数
9个线程, 耗时 11310ms, 共有41538个质数
10个线程, 耗时 11217ms, 共有41538个质数
11个线程, 耗时 11310ms, 共有41538个质数
12个线程, 耗时 11310ms, 共有41538个质数



1个线程, 耗时 43805ms, 共有41538个质数
2个线程, 耗时 22121ms, 共有41538个质数
3个线程, 耗时 14851ms, 共有41538个质数
4个线程, 耗时 11341ms, 共有41538个质数
5个线程, 耗时 11326ms, 共有41538个质数
6个线程, 耗时 11325ms, 共有41538个质数
7个线程, 耗时 11357ms, 共有41538个质数
8个线程, 耗时 11373ms, 共有41538个质数
9个线程, 耗时 11372ms, 共有41538个质数
10个线程, 耗时 11295ms, 共有41538个质数
11个线程, 耗时 11295ms, 共有41538个质数
12个线程, 耗时 11310ms, 共有41538个质数


I52320是4核CPU, 从结果来看, 1-4线程有明显的效率的提升.
4-12线程效率没有太大的差距, 即没有明确的提升, 也没有明确的下降.
结果还是复合预期.

不确定双CPU会对此造成如何的影响.
lijianli9 2012-09-23
  • 打赏
  • 举报
回复
双cpu在内部执行的时候,需要对同一内存访问同步
hztj2005 2012-09-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

I52320是4核CPU, 从结果来看, 1-4线程有明显的效率的提升.
4-12线程效率没有太大的差距, 即没有明确的提升, 也没有明确的下降.
结果还是复合预期.

不确定双CPU会对此造成如何的影响.

[/Quote]

一把来说,线程数应该不超过core的2倍,象你这个测试,4core,4线程是合理的。

2cpu中由于需要同步,比较慢可以理解。

按说,我这个启动8/16个线程,锁定运行于单cpu的8个核中,速度应该是最快的,但速度反而更慢,这就让人费解。


567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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