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 ***** 比什么快? 没关系,我明白了。
酷!
恩,很好,从谷歌学到了一些技巧。
谢谢你,丹尼尔。
也许
#pragma omp parallel for num_threads(8)
更好?
我没有测试。
比什么好?OpenMP很复杂,没有“一刀切”。从给出的例子来看,答案是否定的。你们可能运行i5和i7,但并不是每个人都这样,所以让
#pragma omp parallel for
计算出要自动管理的线程的正确数量。
要获得3倍以上的加速,尤其是在i5 i7上,可以编写一个自定义transpformBy函数,它将更好地利用可用的处理器。幸运的是,这是一个非常适合并行计算的简单函数。
不确定,我想这取决于处理器是否可以优雅地处理8个线程。我的猜测是最好不要静态说明线程数...但是我对OpenMP还不够了解 由于 ARX 应用程序的大部分时间都花在与 Acad 数据库交互上,因此很难找到有效使用多个处理器的机会。在我尝试过的一些挑战中,但大多数情况下必须放弃,因为锁定进程或数据库访问以进行写入会产生负面影响。似乎我会花更多的时间使用OpenMP而不是原始的挑战代码。所以,把它当作它的价值。 在Q6600
释放模式下,带和不带OMP之间没有可测量的速度差
调试模式是3.9倍的加速
数据集大小为150万点,发布运行时间为0.034秒。调试OMP运行时为0.034秒。看来我的系统内存访问已经达到上限了。 这更像是一件探索/学习的事情。如果有一天我真的遇到了一些可以从多线程中“真正”受益的东西,我知道该去哪里寻找。我以前使用过VS2010的PPL库以及一些托管并发库,但从未使用过OpenMP。我想我最喜欢PPL图书馆
1000000点
//openmp开
命令:tt4
0.006115
命令:tt4
0.005942
命令:tt4
0.005784
//openmp关
指令:tt4
0.019366
指令:
页:
[1]