关于malloc或NEW在多线程下的效率

电力信息系统 2009-12-21 12:09:43
加精
//#pragma omp parallel for
for(int i=0;i<100000;i++)
{
malloc(sizeof(int)*1000);

}

单线程比用OPENMP快3倍,请问为何?
如何提高malloc或new 的效率呢?
...全文
706 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
songlei217 2010-08-09
  • 打赏
  • 举报
回复
学习了!
maquan 2009-12-26
  • 打赏
  • 举报
回复
楼主这段程序,只用到了两项资源:

资源1:CPU
资源2:内存(包括 RAM、数据总线、地址总线)

在单线程的情况下,资源2已经满载,成为瓶颈。

多线程的运行方式,只是增加了资源1,并没有解决瓶颈,反而可能增加了线程切换、线程同步等额外开销。所以总的耗时反而增加了。

以上都是猜测,仅供批判。

建议楼主如果有条件有兴趣的话,试一下在启用多线程的同时也启用双通道内存,也许能有好的效果。果如此,则基本可以证实上述猜测。
iisbsd 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhouguoling 的回复:]
单线程比用OPENMP快3倍,请问为何?
如何提高malloc或new 的效率呢?
[/Quote]

我猜测openmp里面用到了锁以保证安全,所以就慢了。
liquanhai 2009-12-24
  • 打赏
  • 举报
回复
7楼很强,学习了!圣诞快乐!
cici_wang_ 2009-12-24
  • 打赏
  • 举报
回复
看看~~~借楼主加分~~~~~~~~
ilyyyfn 2009-12-24
  • 打赏
  • 举报
回复
openmp里面不会加锁,原因是malloc或new内部包含了同步操作,像楼主这样的写法,造成剧烈的锁碰撞

受教了
gamedragon 2009-12-24
  • 打赏
  • 举报
回复
7楼的东西跟本贴一点关系都没有啊,还有这么多起哄的。

malloc应该是线程安全的,里面应该会有锁机制。
topzkz 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 iisbsd 的回复:]
引用楼主 zhouguoling 的回复:
单线程比用OPENMP快3倍,请问为何?
如何提高malloc或new 的效率呢?


我猜测openmp里面用到了锁以保证安全,所以就慢了。
[/Quote]
openmp里面不会加锁,原因是malloc或new内部包含了同步操作,像楼主这样的写法,造成剧烈的锁碰撞
csgdseed 2009-12-24
  • 打赏
  • 举报
回复
向7楼学习
zhyzdl 2009-12-23
  • 打赏
  • 举报
回复
study
yshuise 2009-12-23
  • 打赏
  • 举报
回复
TBB有专门的内存分配函数。
YHL27 2009-12-23
  • 打赏
  • 举报
回复
study!
xiao_rq 2009-12-23
  • 打赏
  • 举报
回复
强!就一个字!
sparkhoc 2009-12-23
  • 打赏
  • 举报
回复
关注
liangmaowu 2009-12-23
  • 打赏
  • 举报
回复
学习学习学习
luokaijie 2009-12-23
  • 打赏
  • 举报
回复
ding
sining520 2009-12-23
  • 打赏
  • 举报
回复
7楼强 学习了
liuyu9920 2009-12-23
  • 打赏
  • 举报
回复
学习学习。。。
CCCCCCCCCCCCCCC 2009-12-23
  • 打赏
  • 举报
回复
首先要说的是,使用 malloc 函数,请包含 stdlib.h(C++ 中是 cstdlib),而不是 malloc.h 。因为 malloc.h 从来没有在 C 或者 C++ 标准中出现过!因此并非所有编译器都有 malloc.h 这个头文件。但是所有的 C 编译器都应该有 stdlib.h 这个头文件。

在 C++ 中,强制转换 malloc() 的返回值是必须的,否则不能通过编译。但是在 C 中,这种强制转换却是多余的,并且不利于代码维护。

起初,C 没有 void 指针,那时 char* 被用来作为泛型指针(generic pointer),所以那时 malloc 的返回值是 char* 。因此,那时必须强制转换 malloc 的返回值。后来,ANSI C(即C89) 标准定义了void 指针作为新的泛型指针。void 指针可以不经转换,直接赋值给任何类型的指针(函数指针除外)。从此,malloc 的返回值变成了 void* ,再也不需要强制转换 malloc 的返回值了。以下程序在 VC6 编译无误通过。

#include <stdlib.h>
int main( void )
{
double *p = malloc( sizeof *p ); /* 不推荐用 sizeof( double ) */
free(p);
return 0;
}

当然,强制转换malloc的返回值并没有错,但画蛇添足!例如,日后你有可能把double *p改成int *p。这时,你就要把所有相关的 (double *) malloc (sizeof(double))改成(int *)malloc(sizeof(int))。如果改漏了,那么你的程序就存在 bug 。就算你有把握把所有相关的语句都改掉,但这种无聊乏味的工作你不会喜欢吧!不使用强制转换可以避免这样的问题,而且书写简便,何乐而不为呢?使用以下代码,无论以后指针改成什么类型,都不用作任何修改。

double *p = malloc( sizeof *p );

类似地,使用 calloc ,realloc 等返回值为 void* 的函数时,也不需要强制转换返回值。

参考资料:
ISO/IEC 9899:1999 (E) Programming languages — C 7.20.3.3 The malloc function
ISO/IEC 9899:1999 (E) Programming languages — C P104 (6.7.2.2)

gamedragon 2009-12-21
  • 打赏
  • 举报
回复
不用那么频繁的malloc

开一大块内存,自己管理,每个线程管自己那一堆

566

社区成员

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

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