Rexdf

The devil is in the Details.

OpenMP在win上面的编译

| Comments

并行库有有Intel® Threading Building Blocks和微软的Parallel Patterns Library,开源的OpenMP等。 架构有Google的Sawzall,Yahoo的Pig 猪和微软的Dryad。 MPI消息机制

而在异构多核计算中,有Nvdia的CUDA™,即Compute Unified Device Architecture;而微软虽然有了DirectX也不甘示弱,提出了C++ AMP (C++ Accelerated Massive Parallelism),以利用显卡日益增加的大规模浮点运算能力。而开源的则对应于OpenCL。

总的来说前前面的几种都是利用多线程在CPU上加速,主要的就是解决线程同步互斥,CPU的Cache冲突等;而后面的则是解决显卡硬件的通用浮点计算。现在显卡的计算性能已近比CPU高出了好几个数量级了,这么高的计算性能,主要是由于大型视屏游戏发展带来的,因此主要都是针对DirectX和OpenGL做的驱动,解决图形运算。然而这么强大的运算能力,自然就想在其他方面利用起来,因此CUDA和C++AMP,OpenCL,WebCL等出现了。简单点说就是在显卡上另外设计一个驱动和行业API适应通用大规模数值运算需求。用途有比如已经不能用了的比特币挖矿,密码破解等。

下面主要记录一下一次编译的经历:

#include <iostream>
#include <time.h>
void test()
{
    int a = 0;
    for (int i=0;i<100000000;i++)
        a++;
}
int main()
{
    clock_t t1 = clock();
    for (int i=0;i<8;i++)
        test();
    clock_t t2 = clock();
    std::cout<<"time: "<<t2-t1<<std::endl;
}

另一段代码

#include <iostream>
#include <time.h>
void test()
{
    int a = 0;
    for (int i=0;i<100000000;i++)
        a++;
}
int main()
{
    clock_t t1 = clock();
    #pragma omp parallel for
    for (int i=0;i<8;i++)
        test();
    clock_t t2 = clock();
    std::cout<<"time: "<<t2-t1<<std::endl;
}

在cygwin的g++4.8.2下面编译,得到如下结果:

cygwin

而如果使用VS2013编译,第二个代码工程在C/C++ –> Language –> Open MP Support yes(/openmp)

vs2013

而我使用Dev-cpp5.6.1里面的MingW G++ 4.8.1编译结果则是比vs结果略微差一点:

vs2013

这里比较奇葩的就是cygwin的生成的了,看了有必要分析下生成的代码了。如此的奇葩。

Comments