eclipse openmp mpi并行编程例子


openmp   

   首先,下载这个版本的Eclipse:http://www.eclipse.org/downloads/packages/eclipse-parallel-application-developers/lunasr1   支持并发编程的版本。

然后下载这个版本的gcc:http://tdm-gcc.tdragon.net/download

     下载的时候看清楚32位和64位的。

   下载完了点击安装,我的安装路径是C:\TDM-GCC-64:

下载http://tdm-gcc.tdragon.net/download网站里的这个包含OpenMP库的压缩包:

32位系统的下载这个:


64位系统下载这个:


下载完了后解压看到这些文件:


将这些文件全部选择,复制。在这里粘贴:


选择是,合并文件夹。

到这里就已经完成OpenMP开发环境的搭建了,接下来打开Eclipse新建一个OpenMP应用程序吧~~

这里就已经完成OpenMP开发环境的搭建了,接下来打开Eclipse新建一个OpenMP应用程序吧~~


选择OpenMP工程,在这里新建的是C语言的工程,编译用的gcc,后面会讲到怎么在C++工程里也是用OpenMP。


然后右键工程,Build Project:


接下来右键Run As:


看看输出结果吧~~




上面只是一个初步介绍,不知道有没有发现在新建工程时没有提供C++ OpenMP选项,如果要在C++工程中使用OpenMP怎么办呢?其实在新建项目的时候没有必要按照上面的要求来,可以新建一个任意的C或C++工程。只要设置编译和链接参数即可。接下来新建一个C++ HelloWorld程序并使用OpenMP。

  在刚才新建项目的选项中选择Hello World C++ Project:

                                                                           

  把源文件代码改成这样:

[cpp]  view plain copy
  1. #include   
  2. #include   
  3. using namespace std;  
  4.   
  5. int main() {  
  6.     omp_set_num_threads(4);  
  7. #pragma omp parallel  
  8.     cout << "!!!Hello World!!! from thread " << omp_get_thread_num() << endl; // prints !!!Hello World!!!  
  9.     return 0;  
  10. }  

然后右键工程—>属性(Properties),在下面这里选择C++编译器,在g++后面加入编译参数

(注意"-fopenmp"和"g++"之间有个空格!)


同样,在C++链接器里也需要加入同样的参数:


OK之后就可以build项目然后运行了~~



下面有几个例子


1 c语言版

/*
 ============================================================================
 Name        : helo.c
 Author      : judyge
 Version     :
 Copyright   : Your copyright notice
 Description : Hello OpenMP World in C
 ============================================================================
 */
#include 
#include 
#include 
/**
 * Hello OpenMP World prints the number of threads and the current thread id
 */
int main (int argc, char *argv[]) {

  int numThreads, tid;

  /* This creates a team of threads; each thread has own copy of variables  */
#pragma omp parallel private(numThreads, tid)
 {
   tid = omp_get_thread_num();
   printf("Hello World from thread number %d\n", tid);

   /* The following is executed by the master thread only (tid=0) */
   if (tid == 0)
     {
       numThreads = omp_get_num_threads();
       printf("Number of threads is %d\n", numThreads);
     }
 }
 return 0;
}

2 c++语言版

/*
 * hellopenmp.cpp
 *
 *  Created on: 2015年4月14日
 *      Author: judyge
 */

#include 
#include 
using namespace std;

int main() {
	omp_set_num_threads(4);
#pragma omp parallel
	cout << "!!!Hello World!!! from thread " << omp_get_thread_num() << endl; // prints !!!Hello World!!!
	return 0;
}



#pragma omp parallel num_threads

/*
 * num_threads.cpp
 *
 *  Created on: 2015年4月14日
 *      Author: judyge
 */


#include 
using namespace std;
int main()
{
  #pragma omp parallel num_threads(5)
  {
    cout << "Hello World!\n";
  }
}


omp_set_num_threads(5);

/*
 * omp_set_num_threads.cpp
 *
 *  Created on: 2015年4月14日
 *      Author: judyge
 */

#include 
#include 
int main()
{
  omp_set_num_threads(5);
  #pragma omp parallel
  {
    std::cout << "Hello World!\n";
  }
}

#pragma omp parallel for

/*
 * forp.cpp
 *
 *  Created on: 2015年4月14日
 *      Author: judyge
 */


int main( )
{
int a[1000000], b[1000000];
// ... some initialization code for populating arrays a and b;
int c[1000000];
#pragma omp parallel for
for (int i = 0; i < 1000000; ++i)
  c[i] = a[i] * b[i] + a[i-1] * b[i+1];
// ... now do some processing with array c
 }


MPI     注意安装位置不能有空格 只有C语言版


下载MPICH:http://www.mpich.org/downloads/ 注意,是下载windows版本的非官方的这个安装包:

32位下载x86,64位下载x86_64。

最好直接安装在某个盘的根目录下,比如我的安装目录是C:\MPICH2,目录中不要出现空格。

   

   安装好后到Eclipse下配置:Windows—>Preferences

eclipse openmp mpi并行编程例子_第1张图片

  选择MPI的include路径,注意红框里的内容。把build命令改成gcc和g++,因为安装的MPICH中没有mpicc和mpic++。。。



/*
 ============================================================================
 Name        : hellompi.c
 Author      : judyge
 Version     :
 Copyright   : Your copyright notice
 Description : Hello MPI World in C 
 ============================================================================
 */
#include 
#include 
#include "mpi.h"

int main(int argc, char* argv[]){
	int  my_rank; /* rank of process */
	int  p;       /* number of processes */
	int source;   /* rank of sender */
	int dest;     /* rank of receiver */
	int tag=0;    /* tag for messages */
	char message[100];        /* storage for message */
	MPI_Status status ;   /* return status for receive */
	
	/* start up MPI */
	
	MPI_Init(&argc, &argv);
	
	/* find out process rank */
	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
	
	/* find out number of processes */
	MPI_Comm_size(MPI_COMM_WORLD, &p); 
	
	
	if (my_rank !=0){
		/* create message */
		sprintf(message, "Hello MPI World from process %d!", my_rank);
		dest = 0;
		/* use strlen+1 so that '\0' get transmitted */
		MPI_Send(message, strlen(message)+1, MPI_CHAR,
		   dest, tag, MPI_COMM_WORLD);
	}
	else{
		printf("Hello MPI World From process 0: Num processes: %d\n",p);
		for (source = 1; source < p; source++) {
			MPI_Recv(message, 100, MPI_CHAR, source, tag,
			      MPI_COMM_WORLD, &status);
			printf("%s\n",message);
		}
	}
	/* shut down MPI */
	MPI_Finalize(); 
	
	
	return 0;
}




你可能感兴趣的:(算法)