小编Jon*_*rsi的帖子

openMP不在visual studio中创建线程

我的openMP版本没有提供任何速度提升.我有一个双核机器,CPU使用率总是50%.所以我尝试了Wiki中给出的示例程序.看起来openMP编译器(Visual Studio 2008)不会创建多个线程.

这是该计划:

 #include <omp.h>
 #include <stdio.h>
 #include <stdlib.h>

 int main (int argc, char *argv[]) {
   int th_id, nthreads;
   #pragma omp parallel private(th_id)
   {
     th_id = omp_get_thread_num();
     printf("Hello World from thread %d\n", th_id);
     #pragma omp barrier
     if ( th_id == 0 ) {
       nthreads = omp_get_num_threads();
       printf("There are %d threads\n",nthreads);
     }
   }
   return EXIT_SUCCESS;
 }
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

Hello World from thread 0
There are 1 threads
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

openmp

14
推荐指数
1
解决办法
9056
查看次数

Visual Studio中的OpenMP任务

我正在尝试学习基于OMP库任务的编程,作为一个例子,我复制并粘贴了从书中获取的以下代码并输出错误

 'task' : expected an OpenMP directive name  
Run Code Online (Sandbox Code Playgroud)

 'taskwait' : expected an OpenMP directive name
Run Code Online (Sandbox Code Playgroud)

我可以运行omp并行循环而不是任务.你知道omp任务是否需要在visual studio中进一步调整?

 #include "stdafx.h"
 #include <omp.h>

 int fib(int n)
 {
   int i, j;
   if (n<2)
    return n;
 else
 {
   #pragma omp task shared(i) firstprivate(n)
   i=fib(n-1);

   #pragma omp task shared(j) firstprivate(n)
   j=fib(n-2);

   #pragma omp taskwait
   return i+j;
 }
 }

 int main()
{
  int n = 10;

  omp_set_dynamic(0);
  omp_set_num_threads(4);

  #pragma omp parallel shared(n)
  {
     #pragma omp single
     printf ("fib(%d) = %d\n", n, fib(n));
  }
}
Run Code Online (Sandbox Code Playgroud)

c++ openmp visual-c++

13
推荐指数
1
解决办法
3570
查看次数

MPI_Type_create_subarray和MPI_Gather

我必须解决一个小的mpi问题.我有4个从属进程,每个进程都希望向master 0发送一个2d子阵列(CHUNK_ROWS X CHUNK_COLUMNS).Master 0收集ddd [ROWS] [COLUMNS]中的所有块并打印出来.我想使用MPI_Gather()

#include <mpi.h>
#include <iostream>
using namespace std;

#define ROWS 10
#define COLUMNS 10
#define CHUNK_ROWS 5
#define CHUNK_COLUMNS 5
#define TAG 0

int** alloca_matrice(int righe, int colonne)
{
int** matrice=NULL;
int i;

matrice = (int **)malloc(righe * sizeof(int*));

if(matrice != NULL){
  matrice[0] = (int *)malloc(righe*colonne*sizeof(int));
  if(matrice[0]!=NULL)
    for(i=1; i<righe; i++)
        matrice[i] = matrice[0]+i*colonne;
  else{
    free(matrice);
    matrice = NULL;
  }
}
else{
  matrice = NULL;
}
return matrice;

}

int main(int argc, char* argv[])
{ …
Run Code Online (Sandbox Code Playgroud)

c parallel-processing mpi

11
推荐指数
1
解决办法
7390
查看次数

使用SSH进行X11转发时执行渲染的位置?

当使用X11转发(例如,使用ssh -X-Y)ssh进入远程系统(例如具有大量计算能力和/或图形硬件的集群)时,图形渲染在哪里完成?如何以一种利用集群图形硬件的方式运行图形密集型工作负载?并且在群集中的VM中运行程序是否复杂?

x11 opengl ssh x11-forwarding

10
推荐指数
1
解决办法
6285
查看次数

OpenMP:基于NUMA的分裂循环

我使用8个OpenMP线程运行以下循环:

float* data;
int n;

#pragma omp parallel for schedule(dynamic, 1) default(none) shared(data, n)
for ( int i = 0; i < n; ++i )
{
    DO SOMETHING WITH data[i]
}
Run Code Online (Sandbox Code Playgroud)

由于NUMA,我想用线程0,1,2,3和后半部分(i = n/2,...)运行循环的前半部分(i = 0,...,n/2-1). ..,n-1)与线程4,5,6,7.

本质上,我想并行运行两个循环,每个循环使用一组独立的OpenMP线程.

如何使用OpenMP实现这一目标?

谢谢

PS:理想情况下,如果来自一个组的线程完成了它们的一半循环,而另一半循环仍然没有完成,我希望来自完成组的线程加入未完成的组处理循环的另一半.

我正在考虑下面的内容,但我想知道我是否可以使用OpenMP执行此操作并且不需要额外的簿记:

int n;
int i0 = 0;
int i1 = n / 2;

#pragma omp parallel for schedule(dynamic, 1) default(none) shared(data,n,i0,i1)
for ( int i = 0; i < n; ++i )
{
    int nt = omp_get_thread_num();
    int j; …
Run Code Online (Sandbox Code Playgroud)

performance multithreading openmp affinity numa

8
推荐指数
1
解决办法
950
查看次数

对于大型消息,MPI挂起在MPI_Send上

在c ++/mpi(mpich2)中有一个简单的程序,它发送一个double类型的数组.如果数组的大小超过9000,那么在调用MPI_Send期间我的程序挂起.如果array小于9000(例如8000),则programm工作正常.源代码如下:

main.cpp中

using namespace std;

Cube** cubes;
int cubesLen;

double* InitVector(int N) {
   double* x = new double[N];
   for (int i = 0; i < N; i++) {
       x[i] = i + 1;
   }
   return x;
}

void CreateCubes() {
    cubes = new Cube*[12];
    cubesLen = 12;
    for (int i = 0; i < 12; i++) {
       cubes[i] = new Cube(9000);
    }
}

void SendSimpleData(int size, int rank) {
    Cube* cube = cubes[0];
    int nodeDest = rank + 1; …
Run Code Online (Sandbox Code Playgroud)

mpi

7
推荐指数
1
解决办法
3825
查看次数

如何在MPI作业中的计算节点上设置环境变量

我不明白在调度程序下使用MPI运行时如何在计算节点上设置环境.

我做:

mpirun -np 1 --hostfile ./hostfile foo.sh
Run Code Online (Sandbox Code Playgroud)

foo.sh:

#!/usr/bin/env zsh                                                                                                  
echo $LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

然后我没有恢复我在交互式shell中的LD_LIBRARY_PATH ...在与MPI连接时执行/获取的初始化文件是什么?

注意:我在zsh下,我试图把东西放在.zprofile或.zshenv而不是.zshrc中,但它似乎没有做出改变......我的LD_LIBRARY_PATH是在一个.profile中设置的. .bshrc,由.zshrc提供.

environment-variables mpi

7
推荐指数
1
解决办法
7067
查看次数

配置 MPI 主机文件以使用多个用户身份

我想在不同的机器上使用 mpirun 运行程序(所有带有 Open Mpi 1.5 的 linux 机器)。

现在我有可以登录的机器username A,还有另一组可以使用username B. 所有机器都可以通过 ssh 访问,但我不知道如何实现这一点。

我的主机文件将是这样的:

localhost          #username local

machine_set_A_1    #username A
machine_set_A_2    #username A
...

machine_set_B_1    #username B
machine_set_B_2    #username B
...
Run Code Online (Sandbox Code Playgroud)

是否有可能实现这一点。谢谢。

ssh mpi openmpi

5
推荐指数
1
解决办法
7902
查看次数

使用C++ API进行多线程处理

我试图使用OpenMP并行我的程序,有时我觉得我达到了死胡同.

我想在我在类中定义(和初始化)的函数成员中共享变量.如果我理解正确,就不可能做一个类#pragma omp parallel shared(foo)的数据成员(例如int,boost::multi_arraystd::vector).例如:在类中的向量数据成员上使用push_back().更新a的值boost::multi_array.

我的问题是,如果OpenMP是适合它的工具,还是应该使用boost :: thread或tbb?或其他什么...什么支持C++ API

Reagrds

c++ tbb openmp boost-thread boost-mpi

5
推荐指数
1
解决办法
495
查看次数

与秩无关的代码:来自大小列表的数组和域

所以当然很容易创建一个具有固定已知等级和大小数组的域(以及来自该数组的数组),

proc do_something(sizes: [1..2] int) {
  const D: domain(2) = {1..sizes[1], 1..sizes[2]};
  var arr: [D] int;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,如何处理不同大小的数组,运行时确定的(或至少不是硬编码的)长度?

proc do_something_2(sizes: [?sd] int) {
  const rank = sd.rank;
  var D: domain(rank); 
  var arr: [D] int; 

  writeln(arr);
}
Run Code Online (Sandbox Code Playgroud)

这条线路var D: domain(rank);失败了,因为它似乎需要一个param等级 - 但即使有效也不清楚如何在之后设置域名; expand似乎它在两个方向上扩展了领域.

arrays chapel

5
推荐指数
1
解决办法
74
查看次数