Changeset View
Changeset View
Standalone View
Standalone View
test-suite/trunk/MultiSource/Benchmarks/Rodinia/hotspot/main.c
#include "hotspot.h" | |||||
#include <glibc_compat_rand.h> | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
/* instead of printing all the values, we only print a part of array (every | |||||
100th value) */ | |||||
#define PRINT_GAP 100 | |||||
/* chip parameters */ | |||||
double t_chip = 0.0005; | |||||
double chip_height = 0.016; | |||||
double chip_width = 0.016; | |||||
double amb_temp = 80.0; | |||||
void hotspotKernel(double result[grid_rows][grid_cols], | |||||
double temp[grid_rows][grid_cols], | |||||
double power[grid_rows][grid_cols], double Cap, double Rx, | |||||
double Ry, double Rz, double step, double ambTemp); | |||||
/* Transient solver driver routine: simply converts the heat | |||||
* transfer differential equations to difference equations | |||||
* and solves the difference equations by iterating | |||||
*/ | |||||
void compute_tran_temp(double result[grid_rows][grid_cols], | |||||
double temp[grid_rows][grid_cols], | |||||
double power[grid_rows][grid_cols]) { | |||||
double grid_height = chip_height / grid_rows; | |||||
double grid_width = chip_width / grid_cols; | |||||
double Cap = FACTOR_CHIP * SPEC_HEAT_SI * t_chip * grid_width * grid_height; | |||||
double Rx = grid_width / (2.0 * K_SI * t_chip * grid_height); | |||||
double Ry = grid_height / (2.0 * K_SI * t_chip * grid_width); | |||||
double Rz = t_chip / (K_SI * grid_height * grid_width); | |||||
double max_slope = MAX_PD / (FACTOR_CHIP * t_chip * SPEC_HEAT_SI); | |||||
double step = PRECISION / max_slope; | |||||
hotspotKernel(result, temp, power, Cap, Rx, Ry, Rz, step, amb_temp); | |||||
} | |||||
int main(int argc, char **argv) { | |||||
/* allocate memory for the temperature and power array */ | |||||
double(*temp)[grid_rows][grid_cols] = | |||||
malloc(grid_rows * grid_cols * sizeof(double)); | |||||
double(*power)[grid_rows][grid_cols] = | |||||
malloc(grid_rows * grid_cols * sizeof(double)); | |||||
double(*result)[grid_rows][grid_cols] = | |||||
malloc(grid_rows * grid_cols * sizeof(double)); | |||||
if (!temp || !power || !result) | |||||
fprintf(stderr, "Unable to allocate memory"); | |||||
glibc_compat_srand(SEED); | |||||
/* read initial temperatures and input power */ | |||||
for (int i = 0; i < grid_rows; i++) { | |||||
double x = ((glibc_compat_rand()) % 512); | |||||
double y = ((glibc_compat_rand()) % 128) * 1e-6; | |||||
for (int j = 0; j < grid_cols; j++) { | |||||
(*temp)[i][j] = x + ((glibc_compat_rand()) % 128) * 1e-3; | |||||
(*power)[i][j] = y; | |||||
(*result)[i][j] = 0.0; | |||||
} | |||||
} | |||||
compute_tran_temp(*result, *temp, *power); | |||||
/* output results */ | |||||
for (int i = 0; i < grid_rows; i++) { | |||||
for (int j = 0; j < grid_cols; j++) { | |||||
if ((i * grid_cols + j) % PRINT_GAP == 0) { | |||||
fprintf(stdout, "%g\n", (*result)[i][j]); | |||||
} | |||||
} | |||||
} | |||||
free(temp); | |||||
free(power); | |||||
return 0; | |||||
} |