如何在Windows下编译GotoBLAS2和用CodeBlocks+MinGW编译项目时打开OpenMP
2011-12-09 05:40
477 查看
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
由于我的测试代码太长, 不便贴出, 这里只是简单的示例:
参考文章: http://techshow.me/doc/377
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
相关文章推荐
- 在Windows下配置MinGW编译环境和Code::Blocks编辑器
- 教你如何用CodeBlocks+MinGW+Qt在windows下的安装及环境配置
- windows中,如何在Codeblocks+MinGW+wxWidgets里面使用中文
- 在Windows下配置MinGW编译环境和Code::Blocks编辑器
- 教你如何用CodeBlocks+MinGW+Qt在windows下的安装及环境配置
- ubuntu下code::blocks编译运行一个简单的gtk+2.0项目
- 编译Code::Blocks源码 with MinGW on Win
- Windows7下配置MinGW+CodeBlocks+OpenCV2.3.1
- 以minGW编译boost库,并在Code::Blocks中设置boost空应用程
- Windows下Codeblocks调试Cocos2d-x项目体验(一次失败的体验)
- Code::Blocks:如何使用每晚编译版
- CODE::BLOCKS+wxWidgets+MinGW+wxFormBuilder在windows下开发GUI程序
- Windows7下配置MinGW+CodeBlocks+OpenCV2.3.1
- 以minGW编译boost库,并在Code::Blocks中设置boost空应用程
- 用Codeblocks的MinGW编译CxImage
- windows下的Code::Blocks + minGW + wxWidgets 开发环境搭建
- 在Code:Blocks使用MinGW编译wxWidgets库
- windows下code::blocks与Qt编译环境搭建
- [FAQ05995] 如何把自己的代码包或开源项目的code, 编译进android D
- windows下的Code::Blocks + minGW + wxWidgets 开发环境搭建