Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C by vi ( 13 years ago )
//CPU2

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

//общее количество точек, попадающее в квадрат
#define N 1e7
//радиус круга
#define R 32768
//квадрат радиуса
#define R2 1073741823

//максимальное число, выдаваемое функцией rand()
#define MAX_VAL 1073741823


//флаг "программа закончена на cpu1" 
volatile int cpu1_finished;
//флаг "программа закончена на cpu2" 
volatile int cpu2_finished;
//флаг "программа закончена на cpu3" 
volatile int cpu3_finished;

//флаг "можно запускать вычисление cpu1"
volatile int cpu1_ready;
//флаг "можно запускать вычисление cpu2"
volatile int cpu2_ready;
//флаг "можно запускать вычисление cpu3"
volatile int cpu3_ready;


//переменная - количество точек, попавших в четверть круга на cpu1
volatile int cpu1_pass;
//переменная - количество точек, попавших в четверть круга на cpu1
volatile int cpu2_pass;
//переменная - количество точек, попавших в четверть круга на cpu1
volatile int cpu3_pass;

//настроечное зерно для последовательности псведослучайных чисел cpu1
volatile int cpu1_seed;
//настроечное зерно для последовательности псведослучайных чисел cpu1
volatile int cpu2_seed;
//настроечное зерно для последовательности псведослучайных чисел cpu1
volatile int cpu3_seed;

//Адрес флага "программа закончена на cpu1"
#define _CPU1_FINISHED 0x10FF00
//Адрес флага "программа закончена на cpu2"
#define _CPU2_FINISHED 0x10FF02
//Адрес флага "программа закончена на cpu3"
#define _CPU3_FINISHED 0x10FF04
//Адрес флага "запустить программу на cpu1"
#define _CPU1_READY  0x10FF06
//Адрес флага "запустить программу на cpu2"
#define _CPU2_READY  0x10FF08
//Адрес флага "запустить программу на cpu3"
#define _CPU3_READY  0x10FF0a
//Адрес переменной для количества точек, попавших в четверть круга на cpu1
#define _CPU1_PASS  0x10FF0c
//Адрес переменной для количества точек, попавших в четверть круга на cpu2
#define _CPU2_PASS  0x10FF0e
//Адрес переменной для количества точек, попавших в четверть круга на cpu3
#define _CPU3_PASS  0x10FF10
//Адрес переменной для настроечного зерна для последовательности псведослучайных чисел на cpu1
#define _CPU1_SEED  0x10FF12
//Адрес переменной для настроечного зерна для последовательности псведослучайных чисел на cpu2
#define _CPU2_SEED  0x10FF14
//Адрес переменной для настроечного зерна для последовательности псведослучайных чисел на cpu3
#define _CPU3_SEED  0x10FF16
//Адрес начального смещения для широковещательной записи
#define BROADCAST 0x01c00000




//выставить значения и установить флаг "программа завершена"
void report_results(){
 //cpu1_pass
 broadcast_write((unsigned int *)(BROADCAST+_CPU2_PASS),cpu1_pass);
 //cpu1_finished=1;
 broadcast_write((unsigned int *)(BROADCAST+_CPU2_FINISHED),1);
 
}

void broadcast_write(unsigned int *addr,int value){
 *addr=value;
}


int main(){
 
    int i, all=0;
 
 unsigned long int x,y;
 
 broadcast_write((unsigned int *)(BROADCAST+_CPU2_READY),0);
 broadcast_write((unsigned int *)(BROADCAST+_CPU2_FINISHED),0);
 //cpu1_ready=0;
 //cpu1_finished=0;

 while(!cpu2_ready){
 }
 
 //cpu1_ready=0;
 //cpu1_pass=0;
 broadcast_write((unsigned int *)(BROADCAST+_CPU2_READY),0);
 broadcast_write((unsigned int *)(BROADCAST+_CPU2_PASS),0);
 srand(cpu2_seed);

 for(all=0;all<N;){
  x=rand()>>16;
  y=rand()>>16;
  if((x<=R)&&(y<=R)&&(x*x+y*y)<R2){
   cpu1_pass++;
  }
  if((x<=R)&&(y<=R)) all++;
 }
 
 report_results();
 

}

 

Revise this Paste

Parent: 67501
Your Name: Code Language: