Articles of 并行处理

使用OpenMP将线程绑定到特定的CPU内核

我知道GOMP_CPU_AFFINITY将线程绑定到特定的核心。 但是,举个例子,他们在这里给出了: GOMP_CPU_AFFINITY =“0 3 2 1” 这里, thread0被连接到—> cpu0 thread1被连接到—> cpu3 thread2被连接到—> cpu2 thread3被连接到—> cpu1 这很清楚。 但是我怎么能同时设置thread0到core0和core2? 环境variables“GOMP_CPU_AFFINITY”的值是什么?

Rmpi:不能使用MPI_Comm_spawn API

我在我的linux机器上安装了Rmpi,并在R中成功加载。在我的机器上有两个版本的MPICH,我相信已经安装了最新版本的Rmpi。 我也不得不更新我的LD_LIBRARY_PATH 。 我主要按照这里的安装说明。 在R加载Rmpi后,我运行mpi.spawn.Rslaves(nslaves=4)并得到以下错误信息: Error in mpi.spawn.Rslaves(nslaves = 2) : You cannot use MPI_Comm_spawn API 有谁知道我可以如何让Rmpi工作? 谢谢!

如何避免使用GNU并行的Bash脚本中的SIGCHLD错误

我正在循环运行script.sh。 该脚本包含一个并行的wget命令。 我收到以下错误: Signal SIGCHLD received, but no signal handler set. 循环如下所示: for i in {1..5}; do /script.sh; done 而导致错误的行看起来像这样(省略选项和设置): cat file.txt | parallel -j15 wget 研究: 我不是GNU并行的专家,但脚本似乎大部分时间工作正常,除非我得到上述错误。 在查看SIGCHLD时,我了解到并行可以创build“僵尸进程”,有时我们需要“收获”这些进程。 此外,我发现你可以杀死进程,因为有时他们可以占用所有可用的连接。 试图理解: 但是,我不知道是什么原因造成的问题。 这是我的平行吗? 我不是“收获”过程吗? 我应该明确杀死进程吗? 是因为我在一个循环中运行一个并行脚本? 我的问题: 我该如何解决SIGCHLD错误? 如果你有这方面的经验,非常感谢你的洞察力。

快速连接Linux上的多个文件

我正在使用Python多处理为每个进程生成临时输出文件。 他们可以是几个GB的大小,我做了几十个这些。 这些临时文件需要被拼接以形成所需的输出,这是被certificate是瓶颈的一步(和一个平行杀手)。 有没有一个Linux工具,通过修改文件系统的元数据,而不是实际上复制内容来创buildconcate文件? 只要它能在任何可以接受的Linux系统上运行。 但是一个文件系统特定的解决scheme不会有太大的帮助。 我不是操作系统或CS的训练,但理论上,它似乎应该是可以创build一个新的inode,并从我想复制的文件的索引节点复制索引节点指针结构,然后取消链接这些索引节点。 是否有任何实用工具可以做到这一点? 考虑到经过深思熟虑的unix公用事业,我完全期待它,但找不到任何东西。 所以我的问题就是这个。 文件系统实际上是一个块设备,一个硬盘,如果这个信息很重要的话。 我没有信心自己写这个,因为我以前从来没有做过任何系统级编程,所以任何指针(对于C / Python代码snipppets)都是非常有帮助的。

使用exec在新进程中执行系统命令

我试图产生一个执行系统命令的进程,而我自己的程序仍在继续,两个进程将并行运行。 我正在linux上工作。 我在网上查询,听起来像我应该使用exec()家庭。 但是它不能像我所期望的那样工作。 例如,在下面的代码中,我只看到“之前”被打印,而不是“完成”。 我很好奇,如果我什么都没有问题? #include <unistd.h> #include <iostream> using namespace std; main() { cout << "before" << endl; execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", (char *) 0); cout << "done" << endl; } [UPDATE] 谢谢你们的评论。 现在我的程序看起来像这样。 一切工作正常,除了最后,我不得不按下完成程序。 我不知道为什么我要按最后input? #include <unistd.h> #include <iostream> using namespace std; main() { cout << "before" << endl; int pid […]

CPU亲和力口罩(把线程放在不同的CPU上)

我有4个线程,我想设置线程1在CPU 1上运行,CPU 2上的线程2等。但是,当我运行我的代码下面,亲和力掩码返回正确的值,但是当我做sched_getcpu()在线程上,它们都返回它们在CPU 4上运行。 有人知道我的问题在这里? 提前致谢! #define _GNU_SOURCE #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <sched.h> #include <errno.h> void *pthread_Message(char *message) { printf("%s is running on CPU %d\n", message, sched_getcpu()); } int main() { pthread_t thread1, thread2, thread3, thread4; pthread_t threadArray[4]; cpu_set_t cpu1, cpu2, cpu3, cpu4; char *thread1Msg = "Thread 1"; char *thread2Msg = "Thread […]

并行运行shell脚本

我有一个shell脚本 洗牌一个大文本文件(600万行6列) 根据第一列对文件进行sorting 输出1000个文件 所以伪代码看起来像这样 file1.sh #!/bin/bash for i in $(seq 1 1000) do Generating random numbers here , sorting and outputting to file$i.txt done 有没有办法来parallel运行这个shell脚本来充分利用多核CPU? 在这一刻, 。 /file1.sh以1到1000的顺序执行,速度非常慢。 谢谢你的帮助。

并行有效地运行多个作业

OS:Cent-OS 我有30,000个工作(或脚本)运行。 每个工作需要3-5分钟。 我有48 CPUs(nproc = 48) 。 我可以使用40 CPUs to run 40 Jobs并行40 CPUs to run 40 Jobs 。 请build议一些脚本或工具通过并行运行每个40个作业来处理30,000个作业。 我做了什么: 我创build了40个不同的文件夹,并通过为每个目录创build一个shell脚本来并行执行作业。 我想知道下一次处理这类工作的更好方法。

如何等待fork()调用的所有subprocess完成?

我分叉了许多进程,并且要测量完成整个任务需要多长时间,即完成所有进程分叉的时间。 请告知如何让父进程等待,直到所有的subprocess终止? 我想确保我在适当的时候停止计时器。 这是作为我使用的代码: #include <iostream> #include <string> #include <fstream> #include <sys/time.h> #include <sys/wait.h> using namespace std; struct timeval first, second, lapsed; struct timezone tzp; int main(int argc, char* argv[])// query, file, num. of processes. { int pCount = 5; // process count gettimeofday (&first, &tzp); //start time pid_t* pID = new pid_t[pCount]; for(int indexOfProcess=0; […]

R中的doMC和foreach循环不工作

我正在尝试在R工作中获得并行处理的foreach包,我遇到了一些问题: 在CRAN for Windows上不存在使foreach工作所需的doMC软件包。 有些博客build议doSNOW应该做同样的工作。 但是,当我用doSNOW运行foreach命令时, %dopar%似乎没有比%do%更快的工作。 实际上它慢得多。 我的CPU是英特尔i7 860 @ 2.80GHz与8 GB的RAM。 以下是我的代码: ##Run example in 1 core require(foreach) require(doSNOW) x= iris[which(iris[,5] != "setosa"),c(1,5)] trials = 10000 system.time({ r= foreach(icount(trials), .combine=cbind) %do% { ind=sample(100,100,replace=TRUE) results1 = glm(x[ind,2]~x[ind,1],family=binomial(logit)) coefficients(results1) } })[3] # elapsed # 37.28 # Same example in 2 cores registerDoSNOW(makeCluster(2,type="SOCK")) getDoParWorkers() trials = […]