# 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; | |||||

} |