178 lines
3.6 KiB
C
Executable File
178 lines
3.6 KiB
C
Executable File
/*
|
|
|
|
This program is part of the TACLeBench benchmark suite.
|
|
Version V 2.0
|
|
|
|
Name: ludcmp
|
|
|
|
Author: Sung-Soo Lim
|
|
|
|
Function: Simultaneous linear equations by LU decomposition.
|
|
|
|
Source: SNU-RT Benchmark Suite, via MRTC
|
|
http://www.mrtc.mdh.se/projects/wcet/wcet_bench/ludcmp/ludcmp.c
|
|
|
|
Changes: Moved initialization into separate function.
|
|
|
|
License: May be used, modified, and re-distributed freely, but
|
|
the SNU-RT Benchmark Suite must be acknowledged
|
|
|
|
*/
|
|
|
|
/*
|
|
This program is derived from the SNU-RT Benchmark Suite for Worst
|
|
Case Timing Analysis by Sung-Soo Lim
|
|
|
|
III-4. ludcmp.c : Simultaneous Linear Equations by LU Decomposition
|
|
(from the book C Programming for EEs by Hyun Soon Ahn)
|
|
*/
|
|
|
|
/*
|
|
Forward declaration of functions
|
|
*/
|
|
|
|
void ludcmp_init( void );
|
|
int ludcmp_return( void );
|
|
int ludcmp_test( int n, double eps );
|
|
void ludcmp_main( void );
|
|
int main( void );
|
|
|
|
double ludcmp_a[ 50 ][ 50 ], ludcmp_b[ 50 ], ludcmp_x[ 50 ];
|
|
int ludcmp_chkerr;
|
|
|
|
void ludcmp_init( void )
|
|
{
|
|
int i, j, n = 5;
|
|
double w;
|
|
volatile int x = 0;
|
|
|
|
_Pragma( "loopbound min 6 max 6" )
|
|
for ( i = 0; i <= n; i++ ) {
|
|
w = 0;
|
|
_Pragma( "loopbound min 6 max 6" )
|
|
for ( j = 0; j <= n; j++ ) {
|
|
ludcmp_a[ i ][ j ] = ( i + 1 ) + ( j + 1 );
|
|
|
|
if ( i == j )
|
|
ludcmp_a[ i ][ j ] *= 10;
|
|
w += ludcmp_a[ i ][ j ];
|
|
|
|
if ( x )
|
|
ludcmp_a[ i ][ j ] += x;
|
|
}
|
|
|
|
ludcmp_b[ i ] = w;
|
|
if ( x )
|
|
ludcmp_b[ i ] += x;
|
|
}
|
|
}
|
|
|
|
int ludcmp_return( void )
|
|
{
|
|
int i, n = 5;
|
|
double checksum = ludcmp_chkerr;
|
|
|
|
_Pragma( "loopbound min 6 max 6" )
|
|
for ( i = 0; i <= n; i++ )
|
|
checksum += ludcmp_x[ i ];
|
|
|
|
/* allow rounding errors for the checksum */
|
|
checksum -= 6.0;
|
|
return ( ( checksum < 0.000001 && checksum > -0.000001 ) ? 0 : -1 );
|
|
}
|
|
|
|
double ludcmp_fabs( double n )
|
|
{
|
|
double f;
|
|
|
|
if ( n >= 0 )
|
|
f = n;
|
|
else
|
|
f = -n;
|
|
|
|
return f;
|
|
}
|
|
|
|
int ludcmp_test( int n, double eps )
|
|
{
|
|
int i, j, k;
|
|
double w, y[ 100 ];
|
|
|
|
|
|
if ( n > 99 || eps <= 0 )
|
|
return ( 999 );
|
|
|
|
_Pragma( "loopbound min 5 max 5" )
|
|
for ( i = 0; i < n; i++ ) {
|
|
if ( ludcmp_fabs( ludcmp_a[ i ][ i ] ) <= eps )
|
|
return ( 1 );
|
|
|
|
_Pragma( "loopbound min 1 max 5" )
|
|
for ( j = i + 1; j <= n; j++ ) {
|
|
w = ludcmp_a[ j ][ i ];
|
|
|
|
if ( i != 0 ) {
|
|
_Pragma( "loopbound min 1 max 4" )
|
|
for ( k = 0; k < i; k++ )
|
|
w -= ludcmp_a[ j ][ k ] * ludcmp_a[ k ][ i ];
|
|
}
|
|
|
|
ludcmp_a[ j ][ i ] = w / ludcmp_a[ i ][ i ];
|
|
}
|
|
|
|
_Pragma( "loopbound min 1 max 5" )
|
|
for ( j = i + 1; j <= n; j++ ) {
|
|
w = ludcmp_a[ i + 1 ][ j ];
|
|
|
|
_Pragma( "loopbound min 1 max 5" )
|
|
for ( k = 0; k <= i; k++ )
|
|
w -= ludcmp_a[ i + 1 ][ k ] * ludcmp_a[ k ][ j ];
|
|
|
|
ludcmp_a[ i + 1 ][ j ] = w;
|
|
}
|
|
}
|
|
|
|
y[ 0 ] = ludcmp_b[ 0 ];
|
|
|
|
_Pragma( "loopbound min 5 max 5" )
|
|
for ( i = 1; i <= n; i++ ) {
|
|
w = ludcmp_b[ i ];
|
|
|
|
_Pragma( "loopbound min 1 max 5" )
|
|
for ( j = 0; j < i; j++ )
|
|
w -= ludcmp_a[ i ][ j ] * y[ j ];
|
|
|
|
y[ i ] = w;
|
|
}
|
|
|
|
ludcmp_x[ n ] = y[ n ] / ludcmp_a[ n ][ n ];
|
|
|
|
_Pragma( "loopbound min 5 max 5" )
|
|
for ( i = n - 1; i >= 0; i-- ) {
|
|
w = y[ i ];
|
|
|
|
_Pragma( "loopbound min 1 max 5" )
|
|
for ( j = i + 1; j <= n; j++ )
|
|
w -= ludcmp_a[ i ][ j ] * ludcmp_x[ j ];
|
|
|
|
ludcmp_x[ i ] = w / ludcmp_a[ i ][ i ];
|
|
}
|
|
|
|
return ( 0 );
|
|
}
|
|
|
|
void _Pragma( "entrypoint" ) ludcmp_main( void )
|
|
{
|
|
int n = 5;
|
|
double eps = 1;
|
|
ludcmp_chkerr = ludcmp_test( n, eps );
|
|
}
|
|
|
|
int main( void )
|
|
{
|
|
ludcmp_init();
|
|
ludcmp_main();
|
|
|
|
return ( ludcmp_return() );
|
|
}
|