该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
引自http://q151.n9.youmac.info/?post=8
不知道有什么错误?在某些集群系统上测试,说什么当有四个cpu核心时,不能得到正确结果,请指教
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#define N 500000
//#define M 100 //分配单位
//#define S 0
/**
* 在(0,1)上的积分∫4/(1+x^2)
*/
long double result=0,sum=0;
int N,M,S;
int main(int argc, char **argv)
{
int cpu_count,tmp,pid,fifor,fifow,buf=0;
if(argc==1){N=7000000;M=500000;S=0;}
else{N=atoi(argv[1]);M=atoi(argv[2]);S=atoi(argv[3]);}
char *fifonames="/tmp/fifoqng",*fifoname="/tmp/fifoback";
mode_t mode;
cpu_count=get_nprocs()+S;
//printf("CpuNum=%d\n",cpu_count);
//printf("N=%d M=%d S=%d\n ",N,M,S);
if(cpu_count==1)
{//只有一个cpu核时
simpleCore();
exit(0);
}
//pids=(int*)malloc(sizeof(int)*cpu_count);\t
if(cpu_count>N/M){
cpu_count=N/M;
}
mode=0666;
result=sum=0.0;
if(mkfifo(fifonames,mode)<0)//创建前向fifo
{
perror("Failed to make fifo");
exit(1);
}
if(mkfifo(fifoname,mode)<0)//创建后向fifo
{
perror("Failed to make fifo");
exit(1);
}
for(tmp=0;tmp
{
pid=fork();
if(pid==0)//child process
{
while(1)
{
fifor=open(fifonames, O_RDONLY);//打开前向通道
while(read(fifor, (char*)&buf, sizeof(int))<=0);//从前向通道中读取信号
//close(fifor);
if(buf==-1)
{//如果是退出信号,则把本进程的结果通过后向通道发给主进程
fifow=open(fifoname,O_WRONLY);
while(write(fifow, (char*)&sum, sizeof(long double))<=0);
close(fifow);
//printf("child %d exit\n",getpid());
exit(0);//子进程退出
}
else//不是退出信号
{
//printf("child:%d,caling:%d\n",getpid(),buf);
buf*=M;
for(tmp=1;tmp<=M;tmp++){//i*M+1到(i+1)*M个矩形
result=(buf+tmp-0.5)/N;
sum+=1.0/(1.0+result*result);
}}
}
}
//printf("child %d's pid=%d\n",tmp,pid);
//pids[tmp]=pid;
}
//root process
//printf("Sending cal msg\n");
fifow=open(fifonames,O_WRONLY);
//printf("fifow:%d\n",fifow);
for(tmp=0;tmp
{
while(write(fifow,(char*)&tmp,sizeof(int))<=0)
usleep(5);
//printf(" %d ",tmp);
}
buf=-1;//发送退出信号
//printf("\nSending exit msg\n");
for(tmp=0;tmp
{
while(write(fifow,(char*)&buf,sizeof(int))<=0);
}
fifor=open(fifoname,O_RDONLY);
//printf("Start to Receive\n");
for(tmp=0;tmp
{
result=0;
while(read(fifor,(char*)&result,sizeof(long double))<=0);
//printf("Received sum:%.14llf\n",result);
sum+=result;
}
sum=4*sum/N;
printf("%.14llf\n",sum);
close(fifor);
close(fifow);
unlink(fifonames);
unlink(fifoname);
//printf("Main exit\n");
getchar();
waitpid(0,NULL,0);
exit(0);
}
int simpleCore()
{
int i,j;
for(i=1;i<=N;i++)
{
result=(i-0.5)/N;
sum+=1.0/(1.0+result*result);
}
sum=4*sum/N;
printf("%.14llf\n",sum);
getchar();
return 0;
}