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

时间:2013-11-12 16:16:03

标签: c linux

我必须使用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;

}

我做得对吗?

1 个答案:

答案 0 :(得分:1)

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

您的程序读取的字节数可能少于儿童编写的字节数。

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

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

您不需要kill

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