Tag: 并行处理

MPI_Gather 2D数组

N是4, N_glob 。 它恰好是相同的大小。 p是4。 这是代码的一小部分: float **global_grid; float **gridPtr; lengthSubN = N/pSqrt; subN = lengthSubN + 2; grid = allocate2D(grid, subN, subN); .. MPI_Type_contiguous(lengthSubN, MPI_FLOAT, &rowType); MPI_Type_commit(&rowType); .. gridPtr = grid; .. MPI_Barrier(MPI_COMM_WORLD); if(id == 0) { global_grid = allocate2D(global_grid, N_glob, N_glob); } MPI_Barrier(MPI_COMM_WORLD); MPI_Gather(&(gridPtr[0][0]), 1, rowType, &(global_grid[0][0]), 1, rowType, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if(id […]

MPI_Type_create_subarray和MPI_Send

这是我在stackoverflow中的第一个问题。 我有两个进程,一个root 0和一个slave 1. Slave分配一个2d数组(CHUNK_ROWS + 2,CHUNK_COLUMNS + 2)并想发送一个[CHUNK_ROWS] [CHUNK_COLUMNS]子数组。 Root分配一个2d数组(ROWS,COLUMNS)并接收想要从ddd [0] [0]存储的子数组并打印它。 结果我弄错了..为什么? 我知道这是一个无意义的代码,但它只是一个简单的程序,可以帮助我在更复杂的项目中。 这里的代码: #include #include 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; // per allocare la matrice devo fare in questo […]

pi计算的OpenMP并行化要么是缓慢的,要么是错误的

我无法并行化我的monte carlo方法来计算pi。 这是并行化的for循环: #pragma omp parallel for private(i,x,y) schedule(static) reduction(+:count) for (i = 0; i < points; i++) { x = rand()/(RAND_MAX+1.0)*2 – 1.0; y = rand()/(RAND_MAX+1.0)*2 – 1.0; // Check if point lies in circle if(x*x + y*y < 1.0) { count++; } } 问题是,如果我使用schedule(static) ,它会低估pi,如果我使用schedule(static) ,它比串行实现慢。 我究竟做错了什么? 我已经尝试了其他方法来解决它(像这样: 使用OpenMP来计算PI的值 ),但它仍然比串行实现慢得多。 提前致谢

串行调用mpi二进制文件作为mpi应用程序的子进程

我有一个大型并行(使用MPI)模拟应用程序,它可以生成大量数据。 为了评估这些数据,我使用了一个python脚本。 我现在需要做的是运行此应用程序很多次(> 1000)并从结果数据计算统计属性。 到目前为止,我的方法是让一个python脚本并行运行(使用mpi4py,使用ie节点),使用subprocess.check_call调用模拟代码。 我需要这个调用来串行运行我的mpi模拟应用程序。 在这种情况下,我不需要模拟并行运行。 然后python脚本可以并行分析数据,并在完成后启动新的模拟运行,直到累积大量运行。 目标是 不保存2000次运行的整个数据集 将中间数据保存在内存中 Stub MWE: file multi_call_master.py : from mpi4py import MPI import subprocess print “Master hello” call_string = ‘python multi_call_slave.py’ comm = MPI.COMM_WORLD rank = comm.Get_rank() size = comm.Get_size() print “rank %d of size %d in master calling: %s” % (rank, size, call_string) std_outfile = “./sm_test.out” […]

私有子句中的变量与OpenMP中并行区域中定义的变量之间是否存在任何差异?

我想知道是否有任何理由更喜欢OpenMP中的private(var)子句超过(私有)变量的本地定义,例如 int var; #pragma omp parallel private(var) { … } 与 #pragma omp parallel { int var; … } 另外,我想知道私人条款的重点是什么。 这个问题已在OpenMP中解释过:局部变量是否自动私有? ,但我确信答案是错的 我不喜欢答案,因为即使C89不阻止你在函数中间定义变量,只要它们在作用域的开头(这是自动的输入并行区域时的情况)。 因此,即使对于老式的C程序员来说,这也不应该有任何区别。 我是否应该将其视为语法糖,它允许在过去的好日子里使用“定义变量 – 在你的function中开始”的风格? 顺便说一下:在我看来,第二个版本也阻止程序员在并行区域之后使用私有变量,希望它可能包含一些有用的东西,所以另一个-1用于private子句。 但是因为我对OpenMP很陌生,所以如果没有对它进行很好的解释,我不想怀疑它。 提前谢谢你的答案!

包含动态分配的数组的自定义数据类型的MPI_reduce():分段错误

我不明白为什么MPI_Reduce()在我使用包含动态分配的数组的自定义MPI数据类型时会立即执行分段错误。 有人知道吗 ? 以下代码在MPI_Reduce()内部与2个处理器崩溃。 但是,如果我删除成员double * d int MyType并相应地更改运算符和MPI类型例程,则减少完成没有任何问题。 使用动态分配的数组是否存在问题,或者我的工作存在根本错误: #include #include #include typedef struct mytype_s { int c[2]; double a; double b; double *d; } MyType; void CreateMyTypeMPI(MyType *mt, MPI_Datatype *MyTypeMPI) { int block_lengths[4]; // # of elt. in each block MPI_Aint displacements[4]; // displac. MPI_Datatype typelist[4]; // list of types MPI_Aint start_address, address; […]

是否有可能将此for循环并行化?

我得到了一些使用OpenMP进行并行化的代码,在各种函数调用中,我注意到这个for循环对计算时间有一些好的负罪感。 double U[n][n]; double L[n][n]; double Aprime[n][n]; for(i=0; i<n; i++) { for(j=0; j<n; j++) { if (j <= i) { double s; s=0; for(k=0; k= i) { double s; s=0; for(k=0; k<i; k++) { s += L[j][k] * U[k][i]; } L[j][i] = (Aprime[j][i] – s) / U[i][i]; } } 然而,在尝试并行化并在这里和那里应用一些信号量之后(没有运气),我开始意识到, else if条件对早期if具有强烈的依赖性​​( L[j][i]是一个已处理的数字)与U[i][i] ,可以设置在早期的if ),在我的观点中,由于竞争条件,使其不可并行化。 […]

对于使用CUDA的嵌套循环

我有一些问题需要嵌套循环,我必须从C / C ++转换为CUDA。 基本上我有4个嵌套循环,它们共享相同的数组并进行位移操作。 #define N 65536 // ———————————————————————————- int a1,a2,a3,a4, i1,i2,i3,i4; int Bit4CBitmapLookUp[16] = {0, 1, 3, 3, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15}; int _cBitmapLookupTable[N]; int s = 0; // index into the cBitmapLookupTable for (i1 = 0; i1 < 16; i1++) { // first customer […]

OpenMP令人尴尬地并行循环,没有加速

我有一个非常简单的并行for循环,它只是将零写入整数数组。 但事实certificate线程越多,循环越慢。 我认为这是由于一些缓存抖动所以我玩了调度,块大小, __restrict__ ,在并行块内嵌套并行,并刷新。 然后我注意到读取数组进行缩减也比较慢。 这应该显然非常简单,并且应该几乎线性加速。 我在这里想念的是什么? 完整代码: #include #include #include #include void tic(), toc(); int main(int argc, const char *argv[]) { const int COUNT = 100; const size_t sz = 250000 * 200; std::vector vec(sz, 1); std::cout << "max threads: " << omp_get_max_threads()<< std::endl; std::cout << "serial reduction" << std::endl; tic(); for(int c […]

记忆围栏如何工作?

我需要了解多核机器中的内存栅栏。 说我有这个代码 核心1 mov [_x], 1; mov r1, [_y] 核心2 mov [_y], 1; mov r2, [_x] 现在没有内存栅栏的意外结果是r1和r2在执行后都可以为0。 在我看来,为了解决这个问题,我们应该在两个代码中都放置内存栅栏,因为仅将它放在一个代码中仍然无法解决问题。 如下…… 核心1 mov [_x], 1; memory_fence; mov r1, [_y] 核心2 mov [_y], 1; memory_fence; mov r2, [_x] 我的理解是正确还是我仍然缺少某些东西? 假设架构是x86。 另外,有人能告诉我如何将内存栅栏放入C ++代码中吗?