gpt4 book ai didi

c - 如何使用 P 处理器计算整数数组元素的总和

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:09 26 4
gpt4 key购买 nike

我必须使用 P 处理器添加整数数组的元素。下面是我到目前为止编写的代码。我已经定义了一个数组和一些 4 个处理器来进行一些测试。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#define P 17
#define SIZE 153

static pid_t id[P];
static int elementsList[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
};

void getSubvectorSum(int elemList[], int start, int step, int size,int wPipe){
int sum = 0;
int i;
for(i = start; i < size; i += step){
sum += elemList[i];
}
write(wPipe,&sum,sizeof sum);
}

int main(){
int fd[2];
int total = 0;
int result;
int nbytes;
int i;
pipe(fd);
for(i = 0; i < P; i++){
id[i] = fork();
if(id[i] == 0){
close(fd[0]);
getSubvectorSum(elementsList,i,P,SIZE,fd[1]);
exit(0);
}
}
for(i = 0; i < P; i++){
wait(NULL);
}
close(fd[1];
for(i = 0; i < P; i++){
nbytes = read(fd[0],&result,sizeof result);
if(nbytes > 0){
printf("Something on the pipe.\n");
total += result;

} else {
printf("Nothing on the pipe.\n");
}
}
for(i = 0; i < P; i++){
kill(id[i],SIGKILL);
}
printf("total result: %d\n",total);
return 0;

}

我做得对吗?

最佳答案

您的程序可能会因大量进程而死锁:一旦管道缓冲区已满,子进程将在 write() 上阻塞,而父进程将在 wait() 上阻塞。无需等待子进程完成即可排空父进程中的管道。

您的程序读取的字节数可能少于 child 写入的字节数。

检查系统调用的错误情况。它可能更容易发现错误。

我不确定,但您可能需要在 EINTR 错误时重试 wait() 调用;否则你会制造僵尸。

你不需要kill

parallel-sum-fork.c and parallel-sum-openmp.c进行比较。

关于c - 如何使用 P 处理器计算整数数组元素的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com