Tag: 并行处理

procs,fork()和mutexes

我想创建并行运行的n个进程,让它们锁定互斥锁,递增计数器,然后解锁并退出。 这是我的代码: #include #include #include #include #include #include #include pthread_mutex_t mutex; int main(int argc, char **argv) { if (argc != 2) return 0; int n = atoi(argv[1]); int i = 0; int status = 0; pthread_mutex_init(&mutex, NULL); pid_t pid = 1; static int *x; x = mmap(NULL, sizeof *x, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, […]

MPI发送和接收不能超过8182倍

我遇到以下代码的麻烦: int main(int argc, char *argv[]){ int id, p, n, ln, i, j, retCode; double *buffer; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD, &id); n = strtol(argv[1],NULL,10); // total number of elements to be distributed ln = n/p; // local number of elements buffer = (double*)calloc(ln, sizeof(double)); if (id == p-1) // Process p-1 send to other […]

结束gcc C Linux中第一个成功的线程

我是一位经验丰富的C程序员,以前从未使用过线程或并行。 我一直在读它,但我没有看到我想要的例子。 我在Mac和Linux上使用gcc C编译器。 我想在我的系统中用一个新的过程X2替换一个重要的过程X,它将启动两个方法,因为只要机器有多个CPU,这两天就会在两个不同的处理器上运行(大多数情况下都是这样)。 这两种方法可能共享一些全局变量,但它们不会写入除自己的堆栈之外的任何内存位置。 他们每个人都会调用系统中的许多其他程序。 我没有想到任何其他并行处理。 一旦任何一个线程完成,那就是它! 这就是答案。 X2应该立即杀死另一个线程并将答案返回给任何调用X2的人。 也许我天真但我认为这是一个众所周知的线程使用。 示例代码请!

并发内核启动示例 – CUDA

我正在尝试为一个非常复杂的CUDA内核实现并发内核启动,所以我想我会从一个简单的例子开始。 它只是启动一个减少总和的内核。 很简单。 这里是: #include #include #include #include extern __shared__ char dsmem[]; __device__ double *scratch_space; __device__ double NDreduceSum(double *a, unsigned short length) { const int tid = threadIdx.x; unsigned short k = length; double *b; b = scratch_space; for (int i = tid; i < length; i+= blockDim.x) b[i] = a[i]; __syncthreads(); do { k […]

雅各比在MPI放松

我在1小时前创建了一个问题,但问得不好,所以我重新创建了一个问题。 我在C中得到了Jacobi放松的代码: while ( error > tol && iter < iter_max ) { error = 0.0; for( int j = 1; j < n-1; j++) { for( int i = 1; i < m-1; i++ ) { Anew[j][i] = 0.25 * ( A[j][i+1] + A[j][i-1] + A[j-1][i] + A[j+1][i]); error = fmax( error, fabs(Anew[j][i] – […]

如何将单个应用程序的特定线程卸载到特定的Xeon Phi核心?

假设我在主机上运行了一个c / c ++应用程序。 主机CPU上运行的线程很少,Xeon Phi内核上运行50个线程。 我怎样才能确保这些50中的每一个都运行在自己的Xeon Phi核心上,并且永远不会从核心缓存中清除(考虑到代码足够小)。 有人可以概述一个非常笼统的想法如何做到这一点以及哪个工具/ API更适合(对于C / C ++代码)? 在主机线程聚合器和50个Phi线程之间交换数据的最快方法是什么? 鉴于实际的并行性将非常有限 – 这个应用程序将更像51线程平面应用程序与一些基本的multithreading数据同步。 我可以使用传统的C / C ++编译器来创建这样的应用程序吗?

在C上使用OpenMP并行一段时间

我想在一段时间内做一个平行,像这样的somothing: while(!End){ for(…;…;…) // the parallel for … // serial code } for循环是while循环的唯一并行部分。 如果我这样做,我会有很多开销: cycles = 0; while(!End){ // 1k Million iterations aprox #pragma omp parallel for for(i=0;i<N;i++) // the parallel for with 256 iteration aprox if(time[i] == cycles){ if (wbusy[i]){ wbusy[i] = 0; wfinished[i] = 1; } } // serial code ++cycles; } for循环的每次迭代都是彼此独立的。 […]

MPI中的进程数量是否有限制?

我正在阅读“使用MPI”并尝试自己执行代码。 第6.3章中有一个网格分解代码。 它编译时没有任何警告或错误,并且使用少量进程运行,但在我的笔记本电脑上失败,但数量更大,比如30。 我的笔记本电脑是4核,超线程和8G内存。 la_grid_2d_new两个版本都不起作用,但第一个版本可以容忍更大的数字,比如35,但是40个进程失败了。 我不知道为什么。 请问你能帮帮我吗? 非常感谢。 #include #include #include typedef struct { int P, Q; int p, q; MPI_Comm grid_comm; MPI_Comm row_comm; MPI_Comm col_comm; } LA_Grid_2d; LA_Grid_2d *la_grid_2d_new(MPI_Comm comm, int P, int Q) { LA_Grid_2d *grid; MPI_Comm row, col; int my_rank, p, q; MPI_Comm_rank(comm, &my_rank); p=my_rank/Q; q=my_rank%Q; MPI_Comm_split(comm, p, q, &row); MPI_Comm_split(comm, q, […]

为什么这个MPI代码执行不正常?

我正在努力创造一个“Hello,world!” 在(开放)MPI中应用,使每个过程按顺序打印出来。 我的想法是让第一个进程在完成时向第二个进程发送消息,然后在第二个到第三个进程发送消息,等等: #include #include int main(int argc,char **argv) { int rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); // See: http://mpitutorial.com/mpi-send-and-receive/ if (rank == 0) { // This is the first process. // Print out immediately. printf(“Hello, World! I am rank %d of %d.\n”, rank, size); MPI_Send(&rank, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); } else […]

如何在MPI中发送具有每个处理器变体的2Darrays

我试图在根0上采用随机生成的数组,稍微随机地改变它,并将每个变体发送到另一个处理器。 这是我到目前为止的代码: #include “stdio.h” #include “stdlib.h” #include “mpi.h” #include “math.h” int main(int argc, char **argv) { int N = 32; int dim = 3; float a = 10.0; int size, rank, i, j, k, q; float **C; float rijx, rijy, rijz, rij, Vij, E=0; float stepsize = 0.05; double Start_time, End_time, Elapse_time; MPI_Status status; MPI_Init(&argc, […]