Tag: 多处理

音频样本生成multithreadingOSX

这个问题是前一个问题的后续问题( 音频制作者与OSX AudioComponent消费者线程和C中的回调线程 ),包括一个测试示例,它的工作和行为符合预期,但并不能完全回答这个问题。 我已经基本上改写了这个问题,并重新编写了示例,因此它只包含普通的C代码。 (我发现前一个例子中几乎没有Objective-C部分的代码只会引起混淆,并使读者分心于问题中必不可少的内容。) 为了利用多个处理器内核以及使CoreAudio拉模型渲染线程尽可能轻量化,LPCM样本的生产者例程显然必须“坐在”不同的线程上,超出实际优先级渲染线程/回调。 它必须将样本提供给循环缓冲区(在此示例中为TPCircularBuffer ),系统将从inNumberFrames的常量中调度数据拉出。 Grand Central Dispatch API提供了一个简单的解决方案,我在一些个人研究(包括试错编码)中推断出了这个解决方案。 这个解决方案很优雅,因为它不会阻止推送和拉动模型之间的任何冲突。 然而,应该处理“子线程”的GCD 到目前为止还没有满足生产者代码的工作线程的特定并行化要求,所以我必须明确地产生一些POSIX线程,具体取决于数量逻辑核心可用。 尽管在加速计算方面结果已经非常显着,但我仍然觉得混合POSIX和GCD有点不合适。 特别是它适用于变量wait_interval ,并且正确地计算它,而不是通过预测渲染线程在下一个循环中需要多少PCM样本。 这是我的测试程序的缩写和简化(伪)代码,在plain-C中。 控制器声明: #include “TPCircularBuffer.h” #include #include #include #include #include typedef struct { TPCircularBuffer buffer; AudioComponentInstance toneUnit; Float64 sampleRate; AudioStreamBasicDescription streamFormat; Float32* f; //array of updated frequencies Float32* a; //array of updated amps Float32* prevf; //array of […]

如何在父母继续前等待所有孩子终止?

我正在做一些并行编程(多处理),我需要父代: 1) Fork几个孩子 2)在创建所有孩子之后,只需等待所有孩子终止 3)在所有孩子被终止后,做一些其他的工作。 这是我试过的: int main(int argc, char **argv[]) { int j, i; pid_t children[3]; int pid; // Fork the processes for(j = 0; j < 3; j++){ if((children[j] = fork()) == 0){ // Child process for(i = 0; i < 2; i++){ printf("child %d printing: %d\n", j, i); } }else { // […]

将工作分成更multithreading需要更多时间,为什么?

我有一个小的C程序,它使用monte-carlo模拟计算pi ,它基本上只测试一个随机点[x,y],如果它在圆圈内部或外部。 为了近似pi,我必须使用大量的样本n ,其具有O(n)的直接比例复杂度。 因此,尝试计算大量样本n,我实现了POSIX线程 api以平衡计算能力。 我的代码如下所示: pthread_t worker[nthreads]; /* creates workers for each thread */ struct param aparam[nthreads]; /* struct param{ long* hits; long rounds; }; */ long nrounds = nsamples / nthreads; /* divide samples to subsets of equal rounds per thread */ for (int i = 0; i < nthreads; ++i) { […]

如何在MPI_Comm_split之后分配句柄?

说,我有8个进程。 当我执行以下操作时,MPU_COMM_WORLD通信器将被分成两个通信器。 具有偶数id的进程将属于一个通信器,具有奇数id的进程将属于另一个通信器。 color=myid % 2; MPI_Comm_split(MPI_COMM_WORLD,color,myid,&NEW_COMM); MPI_Comm_rank( NEW_COMM, &new_id); 我的问题是这两个传播者的手柄在哪里。 拆分之后,处理器的ID为0 1 2 3 4 5 6 7将变为0 2 4 6 | 1 3 5 7。 现在,我的问题是:假设我想在特定的通信器中发送和接收,比如托管偶数ID的那个,然后当我使用错误的通信器从0到2发送消息时,消息可能最终在第二个通信器中,它是否正确? 提前谢谢您的澄清! if(new_id < 2){ MPI_Send(&my_num, 1, MPI_INT, 2 + new_id, 0, NEW_COMM); MPI_Recv(&my_received, 1, MPI_INT, 2 + new_id, 0, NEW_COMM, MPI_STATUS_IGNORE); } else { MPI_Recv(&my_received, 1, MPI_INT, […]

为什么这段代码不能线性扩展?

我写了这个SOR求解器代码。 不要太费心这个算法做什么,这不是关注点。 但仅仅为了完整性:它可以解决线性方程组,这取决于系统的条件有多好。 我用一个病态的2097152行sparce矩阵(从不收敛)运行它,每行最多7个非零列。 翻译:外部do-while循环将执行10000次迭代(我传递的值为max_iters ),中间将执行2097152次迭代,拆分为work_line块,在OpenMP线程之间划分。 最里面的for循环将有7次迭代,除非极少数情况下(小于1%)它可以更少。 sol数组中的线程之间存在数据依赖性。 中间的每次迭代都会更新一个元素,但最多可读取数组的其他6个元素。 由于SOR不是一个精确的算法,在读取时,它可以具有该位置上的任何先前值或当前值(如果您熟悉求解器,这是一个Gauss-Siedel,在某些地方容忍Jacobi行为,为了并行)。 typedef struct{ size_t size; unsigned int *col_buffer; unsigned int *row_jumper; real *elements; } Mat; int work_line; // Assumes there are no null elements on main diagonal unsigned int solve(const Mat* matrix, const real *rhs, real *sol, real sor_omega, unsigned int max_iters, real tolerance) { real […]

C – 并行执行fork()时等待(NULL)的含义

在下面的代码中,forks实际上是并行运行还是一个接一个地运行? wait(NULL)是什么意思? (该程序创建n个子进程,n通过命令行提供) int main ( int argc, char *argv[] ) { int i, pid; for(i = 0; i < atoi(argv[1]); i++) { pid = fork(); if(pid < 0) { printf("Error occured"); exit(1); } else if (pid == 0) { printf("Child (%d): %d\n", i + 1, getpid()); exit(0); } else { wait(NULL); } } }

vfork()调用后退出和返回之间的区别

我有一个程序具有未定义的行为(vfork()使用不当): #include #include #include int main ( int argc, char *argv[] ) { pid_t pid; printf(“___________befor fork______________.\n”); if((pid=vfork()) 0) printf(“parent\n”); else printf(“child\n”); printf(“pid: %d, ppid: %d\n”, getpid(), getppid()); //exit(0); return 0; } 如果我使用exit(0)函数而不是return – 输出是: ___________befor fork______________. child pid: 4370, ppid: 4369 parent pid: 4369, ppid: 2924 如果我使用return 0 – 我得到无限输出: ___________befor fork______________. child pid: […]

文件读取时创建了不需要的子进程

我正在创建一个多进程程序。 当我尝试使用if(f == 0) break;在for循环中调用fork() if(f == 0) break; 。 我得到了所需数量的子进程。 但是现在,我正在处理输入文件,并且最初不知道所需的进程数。 这是我的代码中最小的可能示例。 FILE* file = fopen(“sample_input.txt”, “r”); while(fscanf(file, “%d”, &order) == 1){ f = fork(); if(f == 0){ break; } } 示例sample_input.txt : 5 2 8 1 4 2 现在正在创建数千个子进程(我想要6,文件中的整数),可能是什么原因? 它与文件指针有关吗? 编辑:我用控制台输出做了一些调试,子进程确实打破了循环。 但是,父母一直在阅读一个小文件。 如果我删除fork() ,循环按预期执行6次。 编辑2:我有一个理论,我无法certificate它也许你可以帮助我。 可能是这样的情况:文件指针在进程之间共享,当子进程退出时,它关闭文件,当父进程再次尝试读取时,它只是从头开始(或其他一些奇怪的行为)。 可能是这样吗?

内存中的静态和全局变量

存储在堆栈本身的静态变量是否类似于全局变量? 如果是这样,它们如何受到保护以仅允许本地类访问? 在multithreading上下文中,是否担心这个内存可以被其他线程/内核直接访问? 或者为什么我们不能在多进程/线程环境中使用static / global?

`write(2)`对本地文件系统的primefaces性

显然POSIX说明了这一点 文件描述符或流在其引用的打开文件描述上称为“句柄”; 打开的文件描述可能有几个句柄。 […]应用程序影响第一个句柄上的文件偏移量的所有活动都应暂停,直到它再次成为活动文件句柄。 […]句柄不需要在同一过程中应用这些规则。 – POSIX.1-2008 和 如果两个线程分别调用[write()函数],则每个调用应该看到另一个调用的所有指定效果,或者没有一个。 – POSIX.1-2008 我对此的理解是,当第一个进程发出write(handle, data1, size1)而第二个进程发出write(handle, data2, size2) ,写入可以按任何顺序发生,但data1和data2 必须都是原始的和连续的。 但运行以下代码会给我带来意想不到的结果。 #include #include #include #include #include #include #include die(char *s) { perror(s); abort(); } main() { unsigned char buffer[3]; char *filename = “/tmp/atomic-write.log”; int fd, i, j; pid_t pid; unlink(filename); /* XXX Adding O_APPEND to the flags […]