linux 测试cpu计算圆周率_linux下多进程计算圆周率

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

引自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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值