cbc2010 或delphi2010支持OpenMP吗?

linmutou 2013-02-08 08:56:43
最近下载了delphi & cbc 2010,试用了一下,感觉还是可以的。但不知道会不会支持OpenMp?如果支持,怎么用。
大家如果有使用cbc2010的经验,可以交流。

另外:用cbc编程一个程序,如何在窗口显示后立即执行某一功能。我们知道,如果在FormCreate(TObject *Sender)、FormActivate(TObject *Sender)或FormShow(TObject *Sender)中执行某一功能,特别是要大量运算的功能,窗口要在这些功能执行后才能显示。
...全文
953 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
我不懂电脑 2013-02-20
  • 打赏
  • 举报
回复
OpenMp是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。OpenMP支持的编程语言包括C语言、C++和Fortran;而支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。 OpenMp提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMp中,OpenMp库从程序员手中接管了部分这两方面的工作。 但是,作为高层抽象,OpenMp并不适合需要复杂的线程间同步和互斥的场合。OpenMp的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。 要在Visual C++2005 中使用OpenMP其实不难,只要将 Project 的Properties中C/C++里Language的OpenMP Support开启(参数为 /openmp),就可以让VC++2005 在编译时支持OpenMP 的语法了;而在编写使用OpenMP 的程序时,则需要先include OpenMP的头文件:omp.h。 而要将 for 回圈平行化处理,该怎么做呢?非常简单,只要在前面加上一行 #pragma omp parallel for 就够了! 也可以实际用一段简单的程序,来弄清楚它的运作方式。 #include <STDIO.H> #include <STDLIB.H> voidTest(intn) { for(inti = 0; i < 10000; ++i) { //do nothing, just waste time } printf("%d, ", n); } intmain(intargc, char* argv[]) { for(inti = 0; i < 10; ++i) Test(i); system("pause"); } 上面的程序,在 main() 是一个很简单的回圈,跑十次,每次都会调用Test()这个函数,并把是回圈的执行次数(i)传进Test() 并打印出来。想当然,它的结果会是: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 而如果想利用 OpenMP把 main() 里面的回圈平行化处理呢?只需要修改成下面的样子: #include <omp.h> #include <stdio.h> #include <stdlib.h> voidTest (intn) { for(inti = 0; i < 10000; ++i) { //do nothing, just waste time } printf("%d, ", n); } intmain(intargc, char* argv[]) { #pragma omp parallel for for(int i = 0; i < 10; ++i) Test( i ); system("pause"); } 够简单吧?重头到尾,只加了两行!而执行后,可以发现结果也变了! 0, 5, 1, 6, 2, 7, 3, 8, 4, 9, 可以从结果很明显的发现,他没有照着0到9的顺序跑了!而上面的顺序怎么来的?其实很简单,OpenMP只是把回圈 0 - 9 共十个步骤,拆成 0 - 4, 5 - 9 两部份,丢给不同的执行绪去跑,所以数字才会出现这样交错性的输出~ 而要怎么确定真的有跑多执行绪呢?如果本来有多处理器、多核心处理器或有 Hyper Thread 的话,一个单执行绪程序,最多只会把一颗核心的使用量吃完;像比如说在 Pentium 4 HT 上跑,单一执行绪的程序,在工作管理员中看到的 CPU 使用率最多就是 50%。而利用 OpenMP 把回圈进行平行化处理后,就可以在执行回圈时,把两颗核心的 CPU 都榨光了!也就是CPU 使用率是100%。
genii12345 2013-02-20
  • 打赏
  • 举报
回复
不支持 支持VS2005,2008,2010,2012
linmutou 2013-02-10
  • 打赏
  • 举报
回复
二楼说得正确.就是那个意思. 我正做个程序,要进行大量的运算,假设每运算时要进行600次的计算,我在主程序中运行300次,另外300次用线程来运算,结果计算的时间在在主程序中一次计算600次还要久.因为暂时没要想到其他的解决办法,才想到用OPEN_MP.
dataxdata 2013-02-08
  • 打赏
  • 举报
回复
好像还没看到CB中支持OpenMP的选项,大量的运算可以用TThread放在单独的线程中运行
sololie 2013-02-08
  • 打赏
  • 举报
回复
虽然不晓得openmp是什么,但感觉很厉害的样子。 你的意思是说在窗口显示后执行一个功能(后台做大运算?),但不影响窗口继续响应? FormCreate()内开个线程异步去处理不行么?

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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