多核多线程程序的效率为何跟普通代码几乎一样?

ylongwu 2013-08-14 10:17:30
数组buf1,buf2,buf3的长度均为40000000000,用四个线程各处理长度为10000000000的数据,也就是各处理四分之一的数据,但是发现多线程所用的时间并没有降低,比普通串行处理的代码只快了一点点。

运行时发现,4核的cpu,串行的cpu使用率为25%,多线程的cpu使用率在80%-100%之间跳跃。 请问这段代码有什么问题吗,多谢了!!!


//4个线程各执行50次
for(int i=0;i<50;i++)
{
thread1Flag = (HANDLE)_beginthread(threadFun1, 0, 0);
thread2Flag = (HANDLE)_beginthread(threadFun2, 0, 0);
thread3Flag = (HANDLE)_beginthread(threadFun3, 0, 0);
thread4Flag = (HANDLE)_beginthread(threadFun4, 0, 0);

WaitForSingleObject(thread1Flag,INFINITE);
WaitForSingleObject(thread2Flag,INFINITE);
WaitForSingleObject(thread3Flag,INFINITE);
WaitForSingleObject(thread4Flag,INFINITE);


sum += sum1+sum2+sum3+sum4;
}
cout<<"multithreading sum = "<<sum<<endl;





void threadFun1(void *p)
{
sum1=0;
float *bufPointer1 = &buf1[startLen1];
float *bufPointer2 = &buf2[startLen1];
float *bufPointer3 = &buf3[startLen1];

for(int i=0; i<totalLen1; i++)
{
*bufPointer3 = (*bufPointer1)*(*bufPointer2);
sum1 += *bufPointer3;
*bufPointer1++;
*bufPointer2++;
*bufPointer3++;
}

}

void threadFun2(void *p)
{
sum2 = 0;
float *bufPointer1 = &buf1[startLen2];
float *bufPointer2 = &buf2[startLen2];
float *bufPointer3 = &buf3[startLen2];

for(int i=0; i<totalLen2; i++)
{
*bufPointer3 = (*bufPointer1)*(*bufPointer2);
sum2 += *bufPointer3;
*bufPointer1++;
*bufPointer2++;
*bufPointer3++;
}
}

void threadFun3(void *p)
{
sum3 = 0;
float *bufPointer1 = &buf1[startLen3];
float *bufPointer2 = &buf2[startLen3];
float *bufPointer3 = &buf3[startLen3];

for(int i=0; i<totalLen3; i++)
{
*bufPointer3 = (*bufPointer1)*(*bufPointer2);
sum3 += *bufPointer3;
*bufPointer1++;
*bufPointer2++;
*bufPointer3++;
}
}

void threadFun4(void *p)
{
sum4 = 0;
float *bufPointer1 = &buf1[startLen4];
float *bufPointer2 = &buf2[startLen4];
float *bufPointer3 = &buf3[startLen4];

for(int i=0; i<totalLen4; i++)
{
*bufPointer3 = (*bufPointer1)*(*bufPointer2);
sum4 += *bufPointer3;
*bufPointer1++;
*bufPointer2++;
*bufPointer3++;
}
}
...全文
296 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylongwu 2013-10-11
  • 打赏
  • 举报
回复
结贴,问题解决 1. 开辟线程函数应该放在for循环外部 2. 数组太大,多线程的计算瓶颈在于内存的读写速度上,因为cpu的计算速度远远高于内存的读写速度 循环中的数据如果能存放在缓存中,则几乎会有4倍的提升
hannah_zzz 2013-09-23
  • 打赏
  • 举报
回复
多核的话不知道你是怎么看它的使用率的,如果是任务管理器的话应该是4个核之间均有跳变吧。即使你是单线程,它也会由操作系统分配到当前适合它运行的核上,并不是固定在某个核上做的。外部因素不相同的话,测试结果也没有价值。 你可以看看cpu affinity,把进程固定到某个核上运行,再对比单线程和多线程的结果。
modyaj 2013-08-21
  • 打赏
  • 举报
回复
从上面的代码来看 线程是不是均等分配给每一个核似乎不确定吧 打开支持多核运行的开关(VS的话)并在代码中进行分配

567

社区成员

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

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