我的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) 我正在尝试学习基于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) 我必须解决一个小的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) 当使用X11转发(例如,使用ssh -X
或-Y
)ssh进入远程系统(例如具有大量计算能力和/或图形硬件的集群)时,图形渲染在哪里完成?如何以一种利用集群图形硬件的方式运行图形密集型工作负载?并且在群集中的VM中运行程序是否复杂?
我使用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) 在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运行时如何在计算节点上设置环境.
我做:
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提供.
我想在不同的机器上使用 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)
是否有可能实现这一点。谢谢。
我试图使用OpenMP并行我的程序,有时我觉得我达到了死胡同.
我想在我在类中定义(和初始化)的函数成员中共享变量.如果我理解正确,就不可能做一个类#pragma omp parallel shared(foo)
的数据成员(例如int
,boost::multi_array
和std::vector
).例如:在类中的向量数据成员上使用push_back().更新a的值boost::multi_array
.
我的问题是,如果OpenMP是适合它的工具,还是应该使用boost :: thread或tbb?或其他什么...什么支持C++ API
Reagrds
所以当然很容易创建一个具有固定已知等级和大小数组的域(以及来自该数组的数组),
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
似乎它在两个方向上扩展了领域.