Draftek 发表于 2010-8-18 08:53:23

OpenMP

仅仅这个小宏就让我的循环快了3倍..
Acad::ErrorStatus ExtPointCloud::transformBy( const AcGeMatrix3d & xform )
{
#pragma omp parallel for //<<-------
for(int idx = 0;idx < mPoints.length();idx++)
    mPoints.transformBy(xform);
return Acad::eOk;
}

**** Hidden Message *****

Draftek 发表于 2010-8-18 08:54:28

比什么快?

highflyingbird 发表于 2010-8-18 11:24:40

没关系,我明白了。
酷!

pkohut 发表于 2010-8-18 11:25:41


恩,很好,从谷歌学到了一些技巧。
谢谢你,丹尼尔。
也许
#pragma omp parallel for num_threads(8)

更好?
我没有测试。

pkohut 发表于 2010-8-19 19:43:18


比什么好?OpenMP很复杂,没有“一刀切”。从给出的例子来看,答案是否定的。你们可能运行i5和i7,但并不是每个人都这样,所以让
#pragma omp parallel for
计算出要自动管理的线程的正确数量。
要获得3倍以上的加速,尤其是在i5 i7上,可以编写一个自定义transpformBy函数,它将更好地利用可用的处理器。幸运的是,这是一个非常适合并行计算的简单函数。

pkohut 发表于 2010-8-19 20:06:56


不确定,我想这取决于处理器是否可以优雅地处理8个线程。我的猜测是最好不要静态说明线程数...但是我对OpenMP还不够了解

Draftek 发表于 2010-8-19 20:09:35

由于 ARX 应用程序的大部分时间都花在与 Acad 数据库交互上,因此很难找到有效使用多个处理器的机会。在我尝试过的一些挑战中,但大多数情况下必须放弃,因为锁定进程或数据库访问以进行写入会产生负面影响。似乎我会花更多的时间使用OpenMP而不是原始的挑战代码。所以,把它当作它的价值。

Draftek 发表于 2010-8-19 20:32:37

在Q6600
释放模式下,带和不带OMP之间没有可测量的速度差
调试模式是3.9倍的加速
数据集大小为150万点,发布运行时间为0.034秒。调试OMP运行时为0.034秒。看来我的系统内存访问已经达到上限了。

pkohut 发表于 2010-8-19 21:19:41

这更像是一件探索/学习的事情。如果有一天我真的遇到了一些可以从多线程中“真正”受益的东西,我知道该去哪里寻找。我以前使用过VS2010的PPL库以及一些托管并发库,但从未使用过OpenMP。我想我最喜欢PPL图书馆
1000000点
//openmp开
命令:tt4
0.006115
命令:tt4
0.005942
命令:tt4
0.005784
//openmp关
指令:tt4
0.019366
指令:
页: [1]
查看完整版本: OpenMP