如何在Windows下编译GotoBLAS2和用CodeBlocks+MinGW编译项目时打开OpenMP

GotoBLAS2是一个高性能的数值计算矩阵库, 在测试GotoBLAS2库的时候, 想试试OpenMP的多线程跟单线程的运算速度的差别有多大.

1. 下载安装MinGW, 设置好环境变量;

2. 下载安装CodeBlocks(一个Windows下默认使用MinGW的C/C++ IDE环境), 并简单设置一下MinGW的路径;

3. 在MinGW环境下编译GotoBLAS2:

  首先修改Makefile.rule, 设置为USE_OPENMP = 1, 把USE_THREAD = 0这句注释掉, 设置NUM_THREADS = 1, 或者注释掉这句, 大概原因是OpenMP不能跟pthread一起使用, 否则运算会很慢很慢, 整个系统卡死; 相反, 如果不使用OpenMP, 一定不要定义USE_OPENMP = 0, 要把该句注释掉, 因为定义了就代表使用OpenMP;

  修改Makefile.system DUMMY中 $(MAKE) 为 make, 这样可以排除一些最终无法编译dll的问题;

  使用命令 make BINARY=32 TARGET=CORE2 或 ./quickbuild.win32 编译

  GotoBLAS2还有几个小bug, 一般是缺少C++所需要的extern "C"定义和防止头文件多次包含的预编译保护, 所以推荐使用国人改进的版本OpenBLAS;

  如果动态支持CPU,使用 DYNAMIC_ARCH=1 (推荐打开, 但你可以尝试打开或关闭这个选项, 打开的话编译时间加长, 库文件大小也变大, 不过速度可能会提升);

  修改一下内容
  driver\others\dynamic.c
  line 201 gotoblas = &gotoblas_KATMAI;
  line 203 gotoblas = &gotoblas_PRESCOTT;

4. 在CodeBlocks里使用OpenMP:

  开始写你的测试程序, 头文件里加上 #include <omp.h>,

  然后再Compiler settings里面的Other Options里面填入-fopenmp

  在Linker settings里面的Other linker Options里面填入-fopenmp -lgomp -lpthread (其中-lgomp -lpthread不一定是必须的, 你可以自己看情况决定)

  如果在命令行下编译,可以使用命令

  g++ -fopenmp main.cpp -lgomp -lpthread -o main.exe

由于我的测试代码太长, 不便贴出, 这里只是简单的示例:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <common.h>
#include <cblas.h>
#include <time.h>
#include "gotoblas2.h"

using namespace std;

void eg_print()
{
    #pragma omp parallel
    printf ("[%d] Hello/n", omp_get_thread_num());
}

void eg_for()
{
    #pragma omp parallel for
    for(int i = 0; i <10; i++) {
        printf("i = %d/n", i);
    }
}

void eg_long_for()
{
    int c = 0;
    clock_t t1 = clock();
    for(int i = 0; i <1000000000; i++) {
        c++;
    }
    clock_t t2 = clock();

    printf("Count = %d, t2 = %d, t1 = %d, Time = %d/n", c, t2, t1, t2-t1);
}

int main()
{
    //eg_print();
    //eg_for();

    //测试
    clock_t t1 = clock();

    #pragma omp parallel for
    for( int j = 0; j <2; j++ ) {
        eg_long_for();
    }

    clock_t t2 = clock();
    printf("Total time = %d/n", t2-t1);

    eg_long_for();

    return 0;
}
 

参考文章: http://techshow.me/doc/377

你可能感兴趣的:(thread,windows,测试,compiler,parallel,linker)