C+++;openmp用于并行计算:如何在visual studio中设置? < >我有一个C++程序,它创建一个对象,然后调用这个对象的2个函数,它们彼此独立。看起来是这样的: Object myobject(arg1, arg2); double answer1 = myobject.function1(); double answer2 = myobject.function2(); #pragma omp parallel sections { #pragma omp section { ... section 1 block ... } #pragma omp section { ... section 2 block ... } }
我想让这两个计算并行运行,以节省计算时间。我知道这可以用openmp来实现,但我不知道如何设置它。我发现的唯一例子是将相同的计算(例如“hello world!”)发送到不同的内核,输出是“hello world!”的2倍。在这种情况下我怎么做C+++;openmp用于并行计算:如何在visual studio中设置? < >我有一个C++程序,它创建一个对象,然后调用这个对象的2个函数,它们彼此独立。看起来是这样的: Object myobject(arg1, arg2); double answer1 = myobject.function1(); double answer2 = myobject.function2(); #pragma omp parallel sections { #pragma omp section { ... section 1 block ... } #pragma omp section { ... section 2 block ... } },c++,parallel-processing,openmp,C++,Parallel Processing,Openmp,我想让这两个计算并行运行,以节省计算时间。我知道这可以用openmp来实现,但我不知道如何设置它。我发现的唯一例子是将相同的计算(例如“hello world!”)发送到不同的内核,输出是“hello world!”的2倍。在这种情况下我怎么做 我在Visual Studio 2005中使用Windows XP。您应该查看OpenMP的部分。它的工作原理如下: Object myobject(arg1, arg2); double answer1 = myobject.function1();
我在Visual Studio 2005中使用Windows XP。您应该查看OpenMP的
部分。它的工作原理如下:
Object myobject(arg1, arg2);
double answer1 = myobject.function1();
double answer2 = myobject.function2();
#pragma omp parallel sections
{
#pragma omp section
{
... section 1 block ...
}
#pragma omp section
{
... section 2 block ...
}
}
考虑到团队中至少有两个线程,这两个块可以并行执行,但如何执行每个部分以及在何处执行每个部分取决于实现
有一个更干净的解决方案使用OpenMP任务,但它要求您的编译器支持OpenMP 3.0。MSVC仅支持OpenMP 2.0(即使在VS 11中也是如此!)
您应该在项目设置中明确启用OpenMP支持。如果您是从命令行进行编译,那么选项是/openmp
。第一部分是使用Visual Studio 2005启动并运行openmp,这是非常古老的;这需要一些努力,但在对的回答中有描述
一旦完成了,如果有两种真正完全独立的方法,那么完成这种简单形式的任务并行就相当容易了。注意限定符;如果这些方法正在读取相同的数据,这是可以的,但是如果它们正在更新另一个方法使用的任何状态,或者调用任何其他这样做的例程,那么事情就会中断
只要这些方法完全独立,您就可以使用它们(实际上是更现代的OpenMP 3.0方法,但您可能无法为这样一个旧的编译器获得OpenMP 3.0支持);您还将看到人们滥用parallel for循环来实现这一点,这至少有让您控制线程分配的优势,因此为了完整起见,我在这里包括了这一点,尽管我不能真正推荐:
#include <omp.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int f1() {
int tid = omp_get_thread_num();
printf("Thread %d in function f1.\n", tid);
sleep(rand()%10);
return 1;
}
int f2() {
int tid = omp_get_thread_num();
printf("Thread %d in function f2.\n", tid);
sleep(rand()%10);
return 2;
}
int main (int argc, char **argv) {
int answer;
int ans1, ans2;
/* using sections */
#pragma omp parallel num_threads(2) shared(ans1, ans2, answer) default(none)
{
#pragma omp sections
{
#pragma omp section
ans1 = f1();
#pragma omp section
ans2 = f2();
}
#pragma omp single
answer = ans1+ans2;
}
printf("Answer = %d\n", answer);
/* hacky appraoch, mis-using for loop */
answer = 0;
#pragma omp parallel for schedule(static,1) num_threads(2) reduction(+:answer) default(none)
for (int i=0; i<2; i++) {
if (i==0)
answer += f1();
if (i==1)
answer += f2();
}
printf("Answer = %d\n", answer);
return 0;
}
如果代码所需的内存不多,也可以使用MPI库。为此,首先从本教程中在VisualStudio上安装MPI
或者从这里:
使用以下mpi hello world代码:
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc, char** argv){
int mynode, totalnodes;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &totalnodes);
MPI_Comm_rank(MPI_COMM_WORLD, &mynode);
cout << "Hello world from process " << mynode;
cout << " of " << totalnodes << endl;
MPI_Finalize();
return 0;
}
function1和function2可以是您喜欢同时执行的任何东西;但请注意,这两个功能相互独立。
就这样 即使是最新和最伟大的VisualStudio11仍然只支持OpenMP 2.0。看起来微软正全力以赴将并行处理引入.Net平台,而不是.Oof;我不知道事情有那么糟糕。你正在从两个不同的线程(并行地)写入同一个变量(答案)。不要这样做。注意减少条款。