Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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+++;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();

我想让这两个计算并行运行,以节省计算时间。我知道这可以用openmp来实现,但我不知道如何设置它。我发现的唯一例子是将相同的计算(例如“hello world!”)发送到不同的内核,输出是“hello world!”的2倍。在这种情况下我怎么做


我在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;我不知道事情有那么糟糕。你正在从两个不同的线程(并行地)写入同一个变量(答案)。不要这样做。注意减少条款。