Tag: 并行处理

如何在MPI中传递2D数组并使用C语言创建动态标记值?

我是MPI编程的新手。 我有一个8乘10的数组,我需要用来平行地找到每一行的总和。 在等级0(过程0)中,它将使用二维arrays生成8乘10的矩阵。 然后我会使用tag号作为数组的第一个索引值(行号)。 这样,我可以使用唯一的缓冲区通过Isend发送。 但是,看起来我的Isend标签号生成方法不起作用。 您能否查看以下代码并告诉我是否正确传递2D数组和标签号。 当我运行此代码时,它会在执行runnk 1后停止并等待。 我在本例中使用了3个进程并使用命令mpirun -np 3 test请尽可能通过示例告诉我如何解决此问题。 #include “mpi.h” #include #include int main (int argc, char *argv[]) { MPI_Init(&argc, &argv); int world_rank; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int tag = 1; int arr[8][10]; MPI_Request request; MPI_Status status; int source = 0; int dest; printf (“\n–Current Rank: %d\n”, world_rank); […]

OpenMP中的并行合并排序

我在本文中看到了并行合并排序的算法。 这是代码: void mergesort_parallel_omp (int a[], int size, int temp[], int threads) { if ( threads == 1) { mergesort_serial(a, size, temp); } else if (threads > 1) { #pragma omp parallel sections { #pragma omp section mergesort_parallel_omp(a, size/2, temp, threads/2); #pragma omp section mergesort_parallel_omp(a + size/2, size – size/2, temp + size/2, threads – […]

当我使用并行代码时,为什么我的计算机没有显示加速?

所以我意识到这个问题听起来很愚蠢(是的,我使用的是双核),但是我尝试了两个不同的库(Grand Central Dispatch和OpenMP),并且在使用clock()时使用和不使用的行来计时代码它平行,速度是一样的。 (为了记录,他们都使用自己的平行forms)。 他们报告说是在不同的线程上运行,但也许它们运行在同一个核心上? 有没有办法检查? (两个库都用于C,我在较低层时感到不舒服。)这非常奇怪。 有任何想法吗?

MPI_Waitall失败了

我想知道是否有人可以为我阐明MPI_Waitallfunction。 我有一个程序使用MPI_Isend和MPI_Irecv传递信息。 完成所有发送和接收后,程序中的一个进程(在本例中为进程0)将打印一条消息。 我的Isend / Irecv正在工作,但是该消息在程序中的某个随机点打印出来; 所以我试图使用MPI_Waitall等到所有请求都完成后再打印消息。 我收到以下错误消息: Fatal error in PMPI_Waitall: Invalid MPI_Request, error stack: PMPI_Waitall(311): MPI_Waitall(count=16, req_array=0x16f70d0, status_array=0x16f7260) failed PMPI_Waitall(288): The supplied request in array element 1 was invalid (kind=0) 这是一些相关的代码: MPI_Status *status; MPI_Request *request; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &taskid); MPI_Comm_size(MPI_COMM_WORLD, &numtasks); status = (MPI_Status *) malloc(numtasks * sizeof(MPI_Status)); request = (MPI_Request *) malloc(numtasks […]

C ++并行排序

我需要对存储在结构数组中的数据块进行排序。 结构没有指针。 每个块具有其计数器编号和位于数组块中的位置的坐标,其中数据块等于结构块。 例如,如果我们有一个数据数组,我们可以划分为4个NxN块,我们在结构块的索引数组中有4个结构块,每个结构块在数据数组中有自己的数量和位置,借助我们可以计算使用索引块在数据数组中的块的指针。 应该使用比较器进行排序,该比较器以这样的方式比较两个块,使得两个块中的至少一个具有最少的第i个数据。 例如比较器: for( i = 0; i < N * N; ++i ) { if( a[i] b[i] ) return 1; } 其中a和b是指向数据数组块的指针,由于索引数组和数据数组开始的指针,我们可以得到它们。 排序不应该排序数据数组而是排序索引数组。 所以问题是:我可以使用哪种并行算法(除了框架,库,我需要完全算法或标准语言工具包,如pthread或qt libs,或c / c ++标准库)以避免同步错误? 代码或伪代码也会有所帮助。

如何并行比较两个以上的数字?

是否可以使用SSE4在一条指令中比较一对以上的数字? 英特尔参考咨询有关PCMPGTQ的内容如下 PCMPGTQ – 比较大于的打包数据 对目标操作数(第一个操作数)和源操作数(第二个操作数)中的压缩四字进行SIMD比较。 如果第一个(目标)操作数中的数据元素大于第二个(源)操作数中的相应元素,则目标中的相应数据元素将设置为全1; 否则,设置为0。 这不是我想要的,因为我希望能够决定哪个整数更大,哪个整数更小。 例如,如果我需要比较 32 with 45 13 with 78 44 with 12 99 with 66 我打算将[32, 13, 44, 99]放在一个向量中,将[45, 78, 12, 66]放在另一个向量中,并在一条指令中使用SSE4进行比较,得到[0, 0, 1, 1] 0,0,1,1 [0, 0, 1, 1]结果(0 – 少,1 – 更大) 但似乎这不是PCMPGTQ所做的。 有关如何在此级别使用并行性来加速此比较的任何建议?

OpenMP和GSL RNG – 性能问题 – 4个线程实现比纯序列1(四核CPU)慢10倍

我正在尝试将我的C项目从顺序编程转换为并行编程。 尽管大多数代码现在已经从头开始重新设计,但随机数的生成仍然是其核心。 因此,随机数发生器(RNG)的不良性能会严重影响程序的整体性能。 我写了一些代码行(见下文),以显示我面临的问题而没有太多冗长。 问题如下:每次线程数增加时,性能都会明显变差。 在这个工作站(linux内核2.6.33.4; gcc 4.4.4; intel四核CPU)中,无论迭代次数n多少,并行for循环使用nt = 4比使用nt = 1大约长10倍。 这种情况似乎在这里描述,但焦点主要集中在fortran,一种我不太了解的语言,所以我非常感谢一些帮助。 我试图按照他们的想法创建不同的RNG(使用不同的种子)来访问每个线程,但性能仍然很差。 实际上,每个线程的这个不同的播种点也让我感到困惑,因为我无法看到最终如何保证生成的数字的质量(缺乏相关性等)。 我已经考虑过完全放弃GSL并自己实现一个随机生成器算法(例如Mersenne-Twister),但我怀疑我稍后会遇到同样的问题。 非常感谢您的回答和建议。 请问我可能忘记提及的任何重要事项。 编辑:由lucas1024(pragma for-loop声明)和JonathanDursi(播种;将“a”设置为私有变量)建议的更正。 multithreading模式下的性能仍然非常低迷。 编辑2: Jonathan Dursi建议的实施解决方案(见评论)。 #include #include #include #include #include double d_t (struct timespec t1, struct timespec t2){ return (t2.tv_sec-t1.tv_sec)+(double)(t2.tv_nsec-t1.tv_nsec)/1000000000.0; } int main (int argc, char *argv[]){ double a, b; int i,j,k; int n=atoi(argv[1]), seed=atoi(argv[2]), […]

如何MPI_Gatherv在发送端的位移?

我正在尝试使用MPI_Gatherv重新组合没有深灰色行的子arrays。 图片胜过千言万语: 鬼/晕暗灰色细胞的图形概述http://img535.imageshack.us/img535/9118/ghostcells.jpg 你如何只将*sendbuf部分( MPI_Gatherv手册中的第一个参数)发送到根进程(在另一个结构中没有浪费的重写,这次没有深灰色的行)? *displacements (第4个参数)仅与根进程的*recvbuf相关。 谢谢。 更新(或更准确地说) 我还想发送“边界”(浅灰色)细胞……而不仅仅是“内部”(白色)细胞。 正如osgx正确指出的那样:在这种情况下, MPI_Gatherv就足够……一些条件数组索引会做到这一点。

如何在C中同时运行两个子进程?

所以我进入并发编程,但由于某种原因我甚至无法使用基础知识。 我有一个名为fork.c的文件,其中包含一个方法main。 在这个方法主要我分叉两次,进入子进程1和2。 在孩子1中,我打印了’A’字符50次。 在孩子2中,我打印字符’B’50次。 当我运行我的代码时,我得到输出AAAAA … AAAABBBBBB …. BBBBBB。 但从来没有像ABABABABABABAB那样….事实上,有时我甚至得到了BBBBB …… BBBBAAAA …… AAAAA。 那么为什么我会遇到这种行为? 也许我完全错了。 #include #include void my_char(char n) { write(1, &n, 1); } int main() { int status; pid_t child1, child2; if (!(child1 = fork())) { // first childi int a; for (a = 0; a < 50; a++) { my_char('A'); […]

并行化Fibonacci序列生成器

我正在学习并行化,在一个练习中,我给出了一些我应该提高性能的算法。 其中一个是Fibonacci序列生成器: array[0] = 0; array[1] = 1; for (q = 2; q < MAX; q++) { array[q] = array[q−1] + array[q−2]; } 我怀疑这是不能优化的(通过并行化),因为每个数字都取决于前两个数字(因此间接地依赖于所有前面的数字)。 怎么可以并行化呢?