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