рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢рд┐рдХреНрд╖рд╛рдкреНрд░рдж рдХрд╣рд╛рдиреА рд╕реНрдкрд╖реНрдЯ рд╣реИред



рд╕рдВрджрд░реНрдн рдХреА рд╢рд░реНрддреЗрдВ


рд╡рд┐рд╖рдп рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛-рдЙрдиреНрдореБрдЦ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреЛрдб рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рд▓реЛрд╢рди рдЬреЛ рдХрд┐ рдПрдХ рдЕрдирдзрд┐рдХреГрдд рд╕рдВрд╕реНрдХрд░рдг n рдмрд╛рд░ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдПрдХ, рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░, рдпрджрд┐ рд╡реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдЕрдиреБрдкрд╛рдд рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣:



рдореВрд▓ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд ... рдХрд┐рдпрд╛ рдЧрдпрд╛

рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреЛрдб рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ ... рдХрд┐рдпрд╛ рдЧрдпрд╛

рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ ... рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛

рд░рди рдХреА рд╕рдВрдЦреНрдпрд╛: 3

рдореВрд▓ рдХреЛрдб рдФрд╕рдд рд╕рдордп: 11.954537 рд╕реЗрдХрдВрдбред

рдЕрдиреБрдХреВрд▓рд┐рдд рдХреЛрдб рдФрд╕рдд рд╕рдордп: 1.052994 рд╕реЗрдХрдВрдбред

рд╕реНрдкреАрдбрдЕрдк: 11.35



рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХ, рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдПрдХ рдЬреАрд╕реАрд╕реА рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ, рджреЛ рдХреНрд╡рд╛рдб-рдХреЛрд░ рдЗрдВрдЯреЗрд▓ Xeon E5420 2.5 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ред

рдпрд╣рд╛рдБ, рд╡реИрд╕реЗ, рдХреЛрдб рд╣реИ:



/*

* contestopt.c:

*/



#include "contest.h"



void function3( double a[][NUM], double b[][NUM], double c[][NUM]);

void function2( double a[][NUM]);

double function4(unsigned int second);



double ***p;

double ****x;

double ****y;

double ****z;

double ***wrk1;

double ***wrk2;

double ***bnd;

static double a[NUM][NUM], b[NUM][NUM];



void function1( double result[][NUM], double gos[2], unsigned int second)

{

function2(a);

function2(b);



function3(a, b, result);

gos[0] = function4(second);

}



void function3( double a[][NUM], double b[][NUM], double result[][NUM])

{

int i, j, k;



for (i = 0; i < NUM; i++) {

for (j = 0; j < NUM; j++) {

for (k = 0; k < NUM; k++) {

result[i][j] = result[i][j] + a[i][k] * b[k][j];

}

}

}

}



void function2( double a[][NUM])

{

int i, j;

double first = 0.0;

double second = 1.0;

a[0][0] = first;

a[0][1] = second;

for (i = 0; i < NUM; i++) {

for (j = 0; j < NUM; j++) {

if (!(i == 0 && (j == 0 || j == 1))) {

a[i][j] = first + second;

first = second;

second = a[i][j];

}

if (j % 20 == 0 && j != 0) {

first = first * (j + 1) / (NUM);

second = second * (j + 1) / (NUM);

}

}

first = ((i + 1) * NUM) / first;

second = ((i + 1) * NUM) / second;

}

}



void function5( double ***A, double val)

{

int i, j, k;

for (i = 0; i < XX; i++)

for (j = 0; j < YY; j++)

for (k = 0; k < ZZ; k++)

A[i][j][k] = val;

}



void function6(unsigned int second)

{

int mimax = XX;

int mjmax = YY;

int mkmax = ZZ;



int imax = mimax - 1;

int jmax = mjmax - 1;

int kmax = mkmax - 1;



int i, j, k, l;

double val;

srand((unsigned int ) second);

p = ( double ***) malloc( sizeof ( double **) * XX);

wrk1 = ( double ***) malloc( sizeof ( double **) * XX);

wrk2 = ( double ***) malloc( sizeof ( double **) * XX);

bnd = ( double ***) malloc( sizeof ( double **) * XX);



x = ( double ****) malloc( sizeof ( double ***) * XX);

y = ( double ****) malloc( sizeof ( double ***) * XX);

z = ( double ****) malloc( sizeof ( double ***) * XX);



for (i = 0; i < XX; i++) {

p[i] = ( double **) malloc( sizeof ( double *) * YY);

wrk1[i] = ( double **) malloc( sizeof ( double *) * YY);

wrk2[i] = ( double **) malloc( sizeof ( double *) * YY);

bnd[i] = ( double **) malloc( sizeof ( double *) * YY);



x[i] = ( double ***) malloc( sizeof ( double **) * YY);

y[i] = ( double ***) malloc( sizeof ( double **) * YY);

z[i] = ( double ***) malloc( sizeof ( double **) * YY);



for (j = 0; j < YY; j++) {

p[i][j] = ( double *) malloc( sizeof ( double ) * ZZ);

wrk1[i][j] = ( double *) malloc( sizeof ( double ) * ZZ);

wrk2[i][j] = ( double *) malloc( sizeof ( double ) * ZZ);

bnd[i][j] = ( double *) malloc( sizeof ( double ) * ZZ);



x[i][j] = ( double **) malloc( sizeof ( double *) * ZZ);

y[i][j] = ( double **) malloc( sizeof ( double *) * ZZ);

z[i][j] = ( double **) malloc( sizeof ( double *) * ZZ);



for (k = 0; k < ZZ; k++) {

x[i][j][k] = ( double *) malloc( sizeof ( double ) * 4);

y[i][j][k] = ( double *) malloc( sizeof ( double ) * 3);

z[i][j][k] = ( double *) malloc( sizeof ( double ) * 3);



}



}

}



val = ( double ) rand() / (10.0 * RAND_MAX);

for (i = 0; i < XX; i++)

for (j = 0; j < YY; j++)

for (k = 0; k < ZZ; k++) {

for (l = 0; l < 3; l++) {

x[i][j][k][l] = 1.0;

y[i][j][k][l] = val;

z[i][j][k][l] = 1.0;

}



x[i][j][k][3] = 1.0;

}

function5(bnd, 1.0);

function5(wrk1, 0.0);

function5(wrk2, 0.0);

for (i = 0; i < imax; i++)

for (j = 0; j < jmax; j++)

for (k = 0; k < kmax; k++)

p[i][j][k] = ( double ) (k * k) / ( double ) (kmax * kmax);

}



void function7()

{

int i, j, k;

for (i = 0; i < XX; i++) {

for (j = 0; j < YY; j++) {

free(p[i][j]);

free(wrk1[i][j]);

free(wrk2[i][j]);

free(bnd[i][j]);



for (k = 0; k < ZZ; k++) {

free(x[i][j][k]);

free(y[i][j][k]);

free(z[i][j][k]);

}

free(x[i][j]);

free(y[i][j]);

free(z[i][j]);

}

free(p[i]);

free(wrk1[i]);

free(wrk2[i]);

free(bnd[i]);



free(x[i]);

free(y[i]);

free(z[i]);



}

free(x);

free(y);

free(z);



free(p);

free(wrk1);

free(wrk2);

free(bnd);

}



double function4(unsigned int second)

{

int nn = NN;

double gosa, s0, ss;

int mimax = XX;

int mjmax = YY;

int mkmax = ZZ;

int imax = mimax - 1;

int jmax = mjmax - 1;

int kmax = mkmax - 1;

int iCount, jCount, kCount, loop, i, j, k;



function6(second);

for (loop = 0; loop < nn; loop++) {

gosa = 0.0;

for (k = 1; k < kmax - 1; k++)

for (j = 1; j < jmax - 1; j++)

for (i = 1; i < imax - 1; i++) {

s0 = x[i][j][k][0] * p[i + 1][j][k]

+ x[i][j][k][1] * p[i][j][k]

+ x[i][j][k][2] * p[i][j][k]

+ y[i][j][k][0] * (p[i + 1][j + 1][k] - p[i + 1][j - 1][k]

- p[i - 1][j + 1][k] + p[i - 1][j - 1][k])

+ y[i][j][k][1] * (p[i][j + 1][k + 1] - p[i][j - 1][k + 1]

- p[i][j + 1][k - 1] + p[i][j - 1][k - 1])

+ y[i][j][k][2] * (p[i + 1][j][k + 1] - p[i - 1][j][k + 1]

- p[i + 1][j][k - 1] + p[i - 1][j][k - 1])

+ z[i][j][k][0] * p[i - 1][j][k]

+ z[i][j][k][1] * p[i][j - 1][k]

+ z[i][j][k][2] * p[i][j][k - 1] + wrk1[i][j][k];

ss = (s0 * x[i][j][k][3] - p[i][j][k]) * bnd[i][j][k];

gosa = gosa + ss;

wrk2[i][j][k] = p[i][j][k] + 0.1 * ss;

}

for (iCount = 1; iCount < imax - 1; iCount++)

for (jCount = 1; jCount < jmax - 1; jCount++)

for (kCount = 1; kCount < kmax - 1; kCount++)

p[iCount][jCount][kCount] = wrk2[iCount][jCount][kCount];

}

function7();

return gosa;

}



double exponent( int i, double x)

{

double z = 1.0;

int j;

for (j = 0; j < i; j++) {

z = z * x;

}

return z;

}



double function8( float *a, float p)

{

int i, j;

double h, x;

double s = p;

h = 1.0 / VAL;

for (i = 1; i <= VAL; i++) {

x = h * (i - 0.5);

for (j = 0; j < ORDER; j++) {

s = (a[j] * exponent(j, x)) + s;

}

}

return s * h;

}




* This source code was highlighted with Source Code Highlighter .






рдореВрд▓реНрдпреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛:

# рдбреЗрдлрд┐рди NUM 600

# рдбреЗрдлрд┐рди XX 65

# рдбреЗрдлрд┐рди YY 33

# рдбреЗрдлрд┐рди рдЬреЗрдбрдЬреЗрдб 33

# рдбреЗрдлрд┐рди рдПрдирдПрди 50

# рдбреЗрдлрд┐рди рд╡реИрд▓ 10000000

# рдбреЗрдлрд╝рд┐рди рдУрдбрд░ 30

# рдбреЗрдлрд┐рди рдЯреЛрд▓реЗрд░реЗрдВрд╕ 1e-8



рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░:

/*

* driver.c: Contest driver.

*/



#include <sys/time.h>

#include <stdio.h>

#include <stdlib.h>

#include <inttypes.h>

#include <time.h>



#include "contest.h"

#include "hpctimer.h"



double _RES[NUM][NUM] = { 0.0 };

double _GOS[2] = { 0.0, 0.0 };

double RES[NUM][NUM] = { 0.0 };

double GOS[2] = { 0.0, 0.0 };

float A[ORDER] = { 0.0 };



double function8( float *a, float p);

void function1( double result[][NUM], double gos[2], unsigned int second);



int is_results_eq( double _res[][NUM], double _gos[2], float _p,

double res[][NUM], double gos[2], float p)

{

int i, j;



if (fabsf(_p - p) > 1E-1) {

printf( "_p p\n" );

printf( "%f\n" , _p);

printf( "%f\n" , p);

return 0;

}



if (fabs(_gos[0] - gos[0]) > 1E-1) {

printf( "_gos gos\n" );

printf( "%f\n" , _gos[0]);

printf( "%f\n" , gos[0]);

return 0;

}



for (i = 0; i < NUM; i++)

for (j = 0; j < NUM; j++) {

if (fabs(_RES[i][j] - RES[i][j]) > TOLERANCE) {

printf( "[%d, %d] =\n%f\n%f\n" , i, j, _RES[i][j], RES[i][j]);

return 0;

}

}

return 1;

}



int main( int argc, char **argv)

{

unsigned int second;

unsigned int i, j;

float p = 9.0;

double _res, res;

int nruns = 3;

hpctimer_time_t t0, t1;

double torig = 0.0, topt = 0.0;



srand(time(NULL));

second = 1219304613 + (1000 - (2000.0 * ( double ) rand() / ( double ) (RAND_MAX + 1.0)));

for (i = 0; i < ORDER; i++) {

A[i] = ( float )i;

}



for (i = 0; i < NUM; i++) {

for (j = 0; j < NUM; j++) {

_RES[i][j] = 0.0;

RES[i][j] = 0.0;

}

}



/* Original code */

printf( "Executing original code ... " );

fflush(stdout);

t0 = hpctimer_gettime();

for (i = 0; i < nruns; i++) {

_function1(_RES, _GOS, second);

_res = _function8(A, p);

}

t1 = hpctimer_gettime();

torig = hpctimer_getdiff(t0, t1) / nruns;

printf( "done\n" );

fflush(stdout);



/* Optimized code */

printf( "Executing optimized code ... " );

fflush(stdout);

t0 = hpctimer_gettime();

for (i = 0; i < nruns; i++) {

function1(RES, GOS, second);

res = function8(A, p);

}

t1 = hpctimer_gettime();

topt = hpctimer_getdiff(t0, t1) / nruns;

printf( "done\n" );

fflush(stdout);



printf( "Checking results ... " );

fflush(stdout);



if (!is_results_eq(_RES, _GOS, _res, RES, GOS, res)) {

printf( "RESULTS ARE DIFFERENT!\n" );

} else {

printf( "PASSED\n" );

printf( "Number of runs: %d\n" , nruns);

printf( "Original code average time: %.6f sec.\n" , torig);

printf( "Optimized code average time: %.6f sec.\n" , topt);

printf( "Speedup: %.2f\n" , torig / topt);

}

return 0;

}




* This source code was highlighted with Source Code Highlighter .






рддреНрд╡рд░рдг, рдирд┐рдпрдо рдПрдХ


рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрддрд░ рдкрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рднреА рдХрд╣ рд╕рдХрддрд╛ рд╣реИ: "рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред" рд▓реЗрдХрд┐рди рдкрд╣рд▓рд╛ рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдо рдЬреЛ рдореИрдВ рд▓реЗрдХрд░ рдЖрдпрд╛ рдерд╛ рд╡рд╣ рдЗрд╕ рдХрдерди рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ:



рдкрд╣рд▓рд╛ рдирд┐рдпрдо

рдзреВрдореНрд░рдкрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореИрдЯрд░рд┐рдпрд▓ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо



рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЧреБрджрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдЫ рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИред

рддреЛ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рд░рд╕рд░реА рдирдЬрд╝рд░ рднреА рдШрд╛рддрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдШрд╛рддрд╛рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЗрд╢рд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдХреБрдЫ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдЪрд▓рд╛рдХрд░, рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреБрд▓ рдЧрд┐рдирддреА рдХреЗ рд╕рдордп рдХрд╛ 80% рдЦрд╛рддрд╛ рд╣реИ)ред рдЬрд┐рд╕ рдПрдХреНрд╕рдкреЛрдЬрд░ рд╕реЗ рд╡рд╣ рдирд┐рдкрдЯрддреА рд╣реИ рд╡рд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд╝рдВрдХреНрд╢рди 8 рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди 8 рдореЗрдВ рд╣реА, рдЗрдВрдЯреАрдЧреНрд░рд▓ рдХреА рдЧрдгрдирд╛ рдЕрд╡рдЪреЗрддрди рд░реВрдк рд╕реЗ рджреЗрдЦреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред

рдлрдВрдХреНрд╢рди 4 рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдбрд┐рдлрд░реЗрдВрд╢рд┐рдпрд▓ рд╕реНрдХреАрдо рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рд▓рд┐рдЦрдХрд░ рдмрд╣реБрдд рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдЧреЛрд╕рд╛ рд╕рдВрдЪрдп рдХреЛ рдПрдХ рдЕрд▓рдЧ рд▓реВрдк рдореЗрдВ рд▓реЗ рдЬрд╛рдХрд░ рдЖрдк рдЗрд╕реЗ рдЕрднреА рднреА рдЧрддрд┐ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдлрд╝рдВрдХреНрд╢рди 3 рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рддреНрд╡рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЧреБрдгрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЦрд░реНрдЪ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдЖрдзрд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕реНрдХреНрд╡реЙрдпрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рднреАред рдореИрдВ рд╕реНрдЯреНрд░реИрд╕реЗрди, рдХреЛрдкрд░рд╕реНрдорд┐рде-рд╡рд┐рдиреЛрд╣реНрд░рд╛рдж рдФрд░ рдЕрдиреНрдп рдкрд░реНрдЪреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред



рддреНрд╡рд░рдг, рдирд┐рдпрдо рджреЛ


рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдЗрд╕рдореЗрдВ рдЕрддрд┐рд░реЗрдХ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдкреНрдд рддреНрд╡рд░рдг рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рджреВрд╕рд░реЗ рдирд┐рдпрдо рдХреЗ рдХрд╛рд░рдг рд╣реИ:



рджреВрд╕рд░рд╛ рдирд┐рдпрдо

рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░реЗрдВ рдЬреЛ рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рд╣реИрдВ



рдирд┐рдпрдо, рд╡реИрд╕реЗ, рд╕реБрдВрджрд░ рд╣реИ, рдФрд░ рдпрд╣ рди рдХреЗрд╡рд▓ рдЕрдиреБрдХреВрд▓рди рдкрд░, рдмрд▓реНрдХрд┐ рдкрдардиреАрдпрддрд╛ рдФрд░ рдмреЗрд╣рддрд░ рд╕рдВрдХрд▓рди рдкрд░ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддрд░реНрдХрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрджреНрднреБрдд рдорд╣рд┐рд▓рд╛ рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рддреЗ рд╣реБрдП, "рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ"ред

рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, function4 рдХреЛ рдЕрднрджреНрд░рддрд╛ рдХреЗ рд▓рд┐рдП рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрд╛рд░ рдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВ x, y рдФрд░ z рдХреЛ рдХреИрд╕реЗ рдЖрд░рдореНрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рднрдпрднреАрдд рд╣реЛрдХрд░ рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдирд╖реНрдЯ рдХрд░ рджреЗрдВред рдЙрдирдХрд╛ рдкрд╛рд▓рди wrk1 рдФрд░ bnd рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ trifles рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЬреИрд╕реЗ рдХрд┐ mimax, iCount, ss рдФрд░ рдЕрдиреНрдп рдЕрддрд┐рд░рд┐рдХреНрддред рдирддреАрдЬрддрди, рдХреЛрдб рдмрд╣реБрдд рдХрдо рдФрд░ рдЕрдзрд┐рдХ рд╕реМрдВрджрд░реНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди 6 рдФрд░ рдлрд╝рдВрдХреНрд╢рди 7 рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд╡рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди 4 рдХреЛ рдпрд╛ рддреЛ рддрд╛рд░реНрдХрд┐рдХ рдпрд╛ рд╕рдордп рдкрд░ рд▓реЛрдб рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рджрд░реНрдж рд░рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди 5 рдЕрдЪрд╛рдирдХ рд╕реНрд╡рдпрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди 3 рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдПрдХ рд╕реНрд░реЛрдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди 2 рдХреЛ рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдБрд╕ рд▓реЗрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрдкреАрдбрдЕрдк рдХрд╛рд░рдирд╛рдореЛрдВ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред



рддреНрд╡рд░рдг, рдирд┐рдпрдо рддреАрди


рддреАрд╕рд░рд╛ рдирд┐рдпрдо

рд░реВрдкрд╛рдВрддрд░рдг рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░реЗрдВ



рдореИрдВ рдЕрдм рд╕рдм рдХреБрдЫ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБред рдпрд╣ рдПрдХ рд╢рд╛рдЦрд╛ рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХ рд╣реИред рд╕рдВрдХрд▓рд┐рдд рд▓реВрдк рдпрд╛ рд╢рд╛рдЦрд╛ рдСрдкрд░реЗрдЯрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдмрд╣реБрдд рд╕рд░рд▓реАрдХреГрдд):

1 mov eax, ebx

2 jne $a

3 mov ecx, ebx

4 jmp b

5 a: ...

6 b: ...






рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЗрд╕ рд╕рдордп рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдлрд╝реЗрдЪ - рдбрд┐рдХреЛрдб - рдПрдХреНрдЬрд╝реНрдпреВрдЯ - рд░рд╛рдЗрдЯ-рдмреИрдХ), рдФрд░ рдирд┐рд░реНрджреЗрд╢ 2 рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдВрдХреНрд░рдордг рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрднреА рддрдХ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реЗ рдПрдХ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╕рдВрдХреНрд░рдордг рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдореЙрдбреНрдпреВрд▓ "рдЧрд▓рдд" рд╣реЛрддрд╛ рд╣реИ? рдпрд╣ рд╕рд╣реА рд╣реИ - рдХрдиреНрд╡реЗрдпрд░ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рд╣реИред рдФрд░ рдпрд╣ рдУрд╡рд░рд╣реЗрдб рд╣реИред рд╣рдо рд╕рдВрдХреНрд░рдордг рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдХреЗ рдЗрд╕рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреИрд╕реЗ?

рдореБрдЭреЗ рдЕрдВрддрд┐рдо рд╕рдордЭрд╛рдПрдВ: рдпрджрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп

for (i = 0; i < n; i++) {

sum += p[i];

}






рд▓рд┐рдЦрдирд╛

for (i = 0; i < n; i+=4) {

sum += p[i];

sum += p[i + 1];

sum += p[i + 2];

sum += p[i + 3];

}






рд╣рдо рд╕рдВрдХреНрд░рдордг рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЪрд╛рд░ рдЧреБрдирд╛ рдХрдо рдХрд░ рджреЗрдВрдЧреЗред



рдЗрд╕ рддрдХрдиреАрдХ рдореЗрдВ рдиреБрдХрд╕рд╛рди рдХрд╛ рдПрдХ рдкреИрдХреЗрдЯ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреИрдирд╛рдд рдЯреБрдХрдбрд╝реЛрдВ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЗрд╖реНрдЯрддрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд▓рдВрдмрд╛рдИ, рдФрд░ рдЕрдиреНрдпред рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдПрдХ рд╕рдВрддреБрд▓рди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рд╢рдд рддреНрд╡рд░рдг рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдлрд╝рдВрдХреНрд╢рди 3 рдХреЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓реВрдк рдЕрдирдлреЙрд▓реЛрд┐рдВрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рдЪрдХреНрд░реЛрдВ рд╕реЗ рдирд┐рд╖реНрдХрд╛рд╕рди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди 2 рдореЗрдВ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд╕реЗ рдЦрд░реЛрдВрдЪ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдореБрдЭрд╕реЗ рдмреЗрд╣рддрд░ рдХреМрди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ - рдЕрдЪреНрдЫрд╛ рдХрд┐рдпрд╛ред



рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП: рдЖрд░ред рдЧреЗрд░рдмрд░, рдПред рдмрд┐рд▓ "рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЕрдиреБрдХреВрд▓рди: рд╡реНрдпрдВрдЬрдиреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ ред " 2010, рдЗрдВрдЯреЗрд▓



рддреНрд╡рд░рдг рдирд┐рдпрдо рдЪрд╛рд░


рдЪреМрдерд╛ рдирд┐рдпрдо

рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ



рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреИрд╢ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рдеред рд▓рд┐рдВрдХ рдХреА рд╕реНрдерд╛рдиреАрдпрддрд╛ рдХреА рдРрд╕реА рд╕рдВрдкрддреНрддрд┐ рд╣реИ - рд╕рдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ / рдЕрдХреНрд╕рд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рд╕рдВрдкрддреНрддрд┐; рдФрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА (рдЯреЗрдореНрдкреЛрд░рд▓) рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдФрд░ рд╕реНрдерд╛рдирд┐рдХ (рд╕реНрдерд╛рдирд┐рдХ) рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рд╣реИред рдХреИрд╢рд┐рдВрдЧ рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рд╣реИ, рдФрд░ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░, рдХреИрд╢ рдорд┐рд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдкрддреЗ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдПрдХ рд╣реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдореЗрдВ, рдкрдВрдХреНрддрд┐ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдХреЙрд▓рдо рдмрд┐рдЦрд░рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝реЗрд╢рди рдЬреНрдЮрд╛рдд рддреНрд╡рд░рдг рдкреНрд░рднрд╛рд╡ рджреЗрддрд╛ рд╣реИред

рдЕрдм рдЬрдм рдореИрдВрдиреЗ рдмрд╛рдд рдХреА рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ: рдпрджрд┐ рд╕рдВрд░рдЪрдирд╛ (рд╕рдВрд░рдЪрдирд╛) рдХреИрд╢ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИ, рддреЛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЗ рдмрдЬрд╛рдп - рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред

рдФрд░ рдпрд╣ рднреА, рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреИрд╢ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рд╕рдВрд▓рдЧреНрди рди рд╣реЛрдВред

рдФрд░ рдХрдИ рдЕрдиреНрдп рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВред рдкрдврд╝реЗрдВ - рдХреНрд░рд┐рд╕ рдХреИрд╕рдкрд░реНрд╕рдХреА "рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХред рд╕реНрдореГрддрд┐ рдХрд╛ рдХреБрд╢рд▓ рдЙрдкрдпреЛрдЧ ред тАЭ 2003, рдмреАрдПрдЪрд╡реА-рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ



рддреНрд╡рд░рдг рдирд┐рдпрдо рдкрд╛рдВрдЪ


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИ?



рдкрд╛рдВрдЪрд╡рд╛рдВ рдирд┐рдпрдо

рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ рд╡рд╣рд╛рдВ рдЧрдгрдирд╛рдПрдВ рдХрд░реЗрдВ



рдпрд╣ рдПрд╕рдПрд╕рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдк рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╢реИрдХреНрд╖рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдоред

SSE рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (x86):

  1. MMX - рдкреВрд░реНрдгрд╛рдВрдХ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг (64-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░)
  2. SSE - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рд╡реИрдХреНрдЯрд░ (128 рдмрд┐рдЯреНрд╕) рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░реЗрдВ
рдирд┐рд░реНрджреЗрд╢ рд╕реНрдХреЗрд▓рд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреИрдХреНрдб рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 mulss xmm1, xmm0 | mulps xmm1, xmm0 XMM0 4.0 3.0 2.0 1.0 | 4.0 3.0 2.0 1.0 * | * * * * XMM1 5.0 5.0 5.0 5.0 | 5.0 5.0 5.0 5.0 = | = = = = XMM1 4.0 3.0 2.0 5.0 | 20.0 15.0 10.0 5.0
      
      





SSE рдирд┐рд░реНрджреЗрд╢ рдХреЙрдкреА, рдЕрдВрдХрдЧрдгрд┐рдд, рддреБрд▓рдирд╛, рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдСрдкрд░реЗрд╢рдиреНрд╕ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреНрд░рд┐рдХреА рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдХреЛрдбрд╛рдВрддрд░рдХ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ C ++ рд╡рд░реНрдЧ рд╣реИрдВ, рд╕рдм рдХреЗ рдмрд╛рдж, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рд╣реИ - рд╕рдмрд╕реЗ рдкреЛрд░реНрдЯреЗрдмрд▓ред рдореИрдВ рдЖрдВрддрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдЗрдВрдЯреНрд░рд┐рдВрд╕рд┐рдХреНрд╕ рдПрд╕рдПрд╕рдИ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИред

рд╣рдо xmmintrin.h рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, -msse3 рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХрдВрдкрд╛рдЗрд▓рд░ XMM # рд░рдЬрд┐рд╕реНрдЯрд░, рд╢реЗрдбреНрдпреВрд▓ рдХрдорд╛рдВрдб рдФрд░ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдореЛрдб рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╕рд░рд▓ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЪрд╛рд░ рдлреНрд▓реЛрдЯ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдЬреЛрдбрд╝реЗрдВ:

#include <xmmintrin.h>

void add( float *a, float *b, float *c)

{

__mm128 t0, t1;

t0 = _mm_load_ps(a);

t1 = _mm_load_ps(b);

t0 = _mm_add_ps(t0, t1);

_mm_store_ps(c, t0);

}






рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдВрдЯреНрд░рд┐рдВрд╕рд┐рдХреНрд╕ рдкрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдХреА рдирдХрд▓ рдХреА рдЬрд╛рддреА рд╣реИ (рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдпрд╣ рдмреНрд▓реЙрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред рдлрд╝рдВрдХреНрд╢рди 8, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡реЗрдХреНрдЯрд░рдХреГрдд рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдореИрдВ рдЖрдкрдХреЗ рдзреИрд░реНрдп рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдХреЛрдб рд╕рдкрдиреЗ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрдЯрд░ рдПрдХ рдореЛрдЯреЗ рдЪрдХреНрд░ рд╕реЗ рдХрдЯ рдХрд░ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдПрдХ рдареЛрд╕ рдЫрд▓рд╛рдВрдЧ рджреЗрддрд╛ рд╣реИред



рддреНрд╡рд░рдг, рдирд┐рдпрдо рдЫрд╣


рд╕реАрдорд╛ рдХреА рд╕реНрдерд┐рддрд┐ рджреЗрдЦреЗрдВред рдЬрд╣рд╛рдБ рд╕рдВрднрд╡ рд╣реЛ рд╡рд╣рд╛рдБ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рд░рд▓ рд╕реЗ рдмрджрд▓реЗрдВред рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рд╕рдВрдЧрдгрдирд╛ рдХрдо рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореМрдЬреВрдж рд╣реИрдВред



рдЫрдард╛ рдирд┐рдпрдо

рдорд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ



рдЪрд╛рд▓рдХ рдореЗрдВ, рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ TOLERANCE рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЕрдиреНрдп рджреЛ рд╕рдВрдЦреНрдпрд╛рдПрдВ рджрд╕рд╡реАрдВ рддрдХ рд╕рдЯреАрдХ рд╣реЛрддреА рд╣реИрдВред рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдкреНрд░рд╣рд╛рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди 8 рдореЗрдВ, рдЕрдВрддрд░рд╛рд▓ рдХреЗ рджреЛ рддрд┐рд╣рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рд╕рдЯреАрдХрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рддреАрди рдорд┐рд▓рд┐рдпрди (рдмрд╕ рдХреБрдЫ) рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╣рд░ рдЫрд╣-рд╕рд╛рдд рд╣рдЬрд╛рд░рд╡реЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ

double function8( float *a, float p)

{

int i, j, val, step;

double h, x, z;

double s = p;



h = 1.0 / VAL;

val = 0.33 * VAL;

step = val / 500;

for (i = val; i <= VAL; i += step) {

x = h * i;

z = 1.0;

for (j = 1; j < ORDER; j++) {

z *= x;

s += j * z;

}

}

return s * h * step;

}






рдФрд░ рдЖрдирдиреНрдж рдордирд╛рдУред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рд╣реИ? рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рдЖрдк рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдШрд╛рддрд╛рдВрдХ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

double function8( float *a, float p)

{

unsigned int j;

double s = p / VAL;

for (j = 0; j < ORDER; j++) {

s += (a[j] / (j + 1));

}

return s;

}






рдпрд╣ O (ORDER) рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ - рдореВрд▓ O (VAL) * O (ORDER ^ 2) рдХреА рддреБрд▓рдирд╛ рдореЗрдВред рдмрд░реНрдиреМрд▓реА рдирдВрдмрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рдЗрддрдирд╛ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рдЦрдХрд░ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдЖрдк рдПрдХ рдЪреБрдХрддрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рднрд░рдиреЗ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╢реВрдиреНрдп рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк рддреАрди рдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдЖрдпрд╛рдореА рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдЬреИрд╕реЗ:

m1 = (YY - 1) * (ZZ - 1); рдПрдо 2 = (рдЬреЗрдбрдЬреЗрдб - 1); p [i * m1 + j * m2 + k]ред рдпрд╣ рдЫреЛрдЯреА рд╕реА рдЪрд╛рд▓ рдмрд╣реБрдЖрдпрд╛рдореА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рднрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдЖрдкрдХреЛ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА __inline рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред



рдФрд░ рдЕрдзрд┐рдХред рдЪреВрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЖрда-рдХреЛрд░ рдорд╢реАрди рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЖрдк рдУрдкрдирдПрдордкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдлрд╝рдВрдХреНрд╢рди 3, рдлрд╝рдВрдХреНрд╢рди 4 рдФрд░ рдлрд╝рдВрдХреНрд╢рди 8 рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд▓реНрдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдлрд╝рдВрдХреНрд╢рди 1 рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдереЛрдбрд╝реА рдХрдо рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди 3 рдФрд░ рдлрд╝рдВрдХреНрд╢рди 4 рдбреЗрдЯрд╛ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИрдВ)ред



рдорд┐рдард╛рдИ рдХреЗ рд▓рд┐рдП - рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕рдВрд╕реНрдХрд░рдгред рдпрд╣ рдЖрджрд░реНрд╢ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдИрдорд╛рдирджрд╛рд░ рдореБрджреНрджреЛрдВ рдореЗрдВ рдХрдИ рд╕реМ рдмрд╛рд░ рддреНрд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред

/*

* contestopt.c:

*/



#include <sys/time.h>

#include <omp.h>

#include "contest.h"



void function3( double a[][NUM], double c[][NUM]);

void function2( double a[][NUM]);

double function4(unsigned int second);



static double p[XX][YY][ZZ] __attribute__ ((aligned(64)));

static double wrk2[XX][YY][ZZ] __attribute__ ((aligned(64)));

static double a[NUM][NUM] __attribute__ ((aligned(64)));



void function1( double result[][NUM], double gos[2], unsigned int second)

{

#pragma omp parallel sections

{

#pragma omp section

function3(a,result);



#pragma omp section

gos[0] = function4(second);

}

}



void function3( double a[][NUM], double result[][NUM])

{

int i, i2, j, j2, k, k2;

double *restrict rres;

double *restrict rmul1;

double *restrict rmul2;

unsigned int BS = 8;

int remainder = NUM % 8;

int limit = NUM - remainder;



function2(a);

if (!(NUM & 1)) {

#pragma omp for private (k, j, i, i2, j2, k2, rres, rmul1, rmul2)

for (i = 0; i < limit; i += BS)

for (j = 0; j < limit; j += BS)

for (k = 0; k < limit; k += BS)

for (i2 = 0, rres = &result[i][j], rmul1 = &a[i][k]; i2 < BS;

++i2, rres += NUM, rmul1 += NUM) {

_mm_prefetch (&rmul1[8], _MM_HINT_NTA);

if (!(NUM & 1))

for (k2 = 0, rmul2 = &a[k][j]; k2 < BS; ++k2, rmul2 += NUM) {

__m128d m1d = _mm_load_sd (&rmul1[k2]);

m1d = _mm_unpacklo_pd (m1d, m1d);

j2 = 0;

__m128d m2 = _mm_load_pd (&rmul2[j2]);

__m128d r2 = _mm_load_pd (&rres[j2]);

_mm_store_pd (&rres[j2],

_mm_add_pd (_mm_mul_pd (m2, m1d), r2));

j2 +=2;

m2 = _mm_load_pd (&rmul2[j2]);

r2 = _mm_load_pd (&rres[j2]);

_mm_store_pd (&rres[j2],

_mm_add_pd (_mm_mul_pd (m2, m1d), r2));

j2 +=2;

m2 = _mm_load_pd (&rmul2[j2]);

r2 = _mm_load_pd (&rres[j2]);

_mm_store_pd (&rres[j2],

_mm_add_pd (_mm_mul_pd (m2, m1d), r2));

j2 +=2;

m2 = _mm_load_pd (&rmul2[j2]);

r2 = _mm_load_pd (&rres[j2]);

_mm_store_pd (&rres[j2],

_mm_add_pd (_mm_mul_pd (m2, m1d), r2));

}

}

} else {

#pragma omp for private (k, j, i, i2, j2, k2, rres, rmul1, rmul2)

for (i = 0; i < limit; i += BS)

for (j = 0; j < limit; j += BS)

for (k = 0; k < limit; k += BS)

for (i2 = 0, rres = &result[i][j], rmul1 = &a[i][k]; i2 < BS;

++i2, rres += NUM, rmul1 += NUM) {

_mm_prefetch (&rmul1[8], _MM_HINT_NTA);

for (k2 = 0, rmul2 = &a[k][j]; k2 < BS; ++k2, rmul2 += NUM) {

for (j2 = 0; j2 < BS; j2++ ) {

rres[j2] += rmul1[k2] * rmul2[j2];

}

}

}

}

if (remainder) {

#pragma omp for private (i,j,k)

for (i = 0; i < limit; ++i)

for (k = NUM - remainder; k < NUM; ++k)

for (j = 0; j < limit; ++j)

result[i][j] += a[i][k] * a[k][j];

#pragma omp for private (i,j,k)

for (i = limit; i < NUM; ++i)

for (k = 0; k < NUM; ++k)

for (j = 0; j < NUM; ++j)

result[i][j] += a[i][k] * a[k][j];

#pragma omp for private (i,j,k)

for (i = 0; i < limit; ++i)

for (k = 0; k < NUM; ++k)

for (j = limit; j < NUM; ++j)

result[i][j] += a[i][k] * a[k][j];

}

}



void function2( double a[][NUM])

{

int i, j ;

double first = 0.0;

double second = 1.0;



__assume_aligned(a, 64);



a[0][0]=first;

a[0][1]=second;



for (j = 2; j < NUM; j++) {

a[0][j] = first + second;

first = second;

second = a[0][j];

if ( j%20 == 0 && j != 0) {

first = first * (j + 1) / (NUM);

second = second * (j + 1) / (NUM);

}

}

first = NUM / first;

second = NUM / second;

for (i = 1; i < NUM; i++) {

for (j = 0; j < NUM; j++) {

a[i][j] = first + second;

first = second;

second = a[i][j];

if ( j%20 == 0 && j != 0 ) {

first = first * (j + 1) / (NUM);

second = second * (j + 1) / (NUM);

}

}

first = ((i + 1) * NUM) / first;

second = ((i + 1) * NUM) / second;

}

}



__inline void function6(unsigned int second)

{

int imax = XX - 1;

int jmax = YY - 1;

int kmax = ZZ - 1;

int i, j, k;



double kmaxDoubled = kmax * kmax;

for (k = 0; k < kmax; k++)

p[0][0][k] = (k * k) / kmaxDoubled;

for (i = 0; i < imax; i++)

for (j = 0; j < jmax; j++)

for (k = 1; k < kmax; k++)

p[i][j][k] = p[0][0][k];

}



double function4(unsigned int second)

{

int nn = NN;

double gosa = 0.0, val;

int imax = XX - 2;

int jmax = YY - 2;

int kmax = ZZ - 2;

int loop, i, j, k;



function6(second);

srand((unsigned int )second);

val = ( double ) rand() / (10.0 * RAND_MAX);

for (loop = 1; loop < nn; loop++) {

for (k = 1; k < kmax; k++)

for (j = 1; j < jmax; j++)

for (i = 1; i < imax; i++) {

wrk2[i][j][k] = 0.1 * ( p[i + 1][j][k] + p[i][j][k]

+ val * (p[i + 1][j + 1][k] - p[i + 1][j - 1][k]

- p[i - 1][j + 1][k] + p[i - 1][j - 1][k]

+ p[i][j + 1][k + 1] - p[i][j - 1][k + 1]

- p[i][j + 1][k - 1] + p[i][j - 1][k - 1]

+ p[i + 1][j][k + 1] - p[i - 1][j][k + 1]

- p[i + 1][j][k - 1] + p[i - 1][j][k - 1])

+ p[i - 1][j][k] + p[i][j - 1][k] + p[i][j][k - 1]);

}

for (i = 1; i < imax; i++)

for (j = 1; j < jmax; j++)

for (k = 1; k < kmax; k++) p[i][j][k] += wrk2[i][j][k];

}

for (k = 1; k < kmax; k++)

for (j = 1; j < jmax; j++)

for (i = 1; i < imax; i++) {

gosa += p[i + 1][j][k] + p[i][j][k]

+ val * (p[i + 1][j + 1][k] - p[i + 1][j - 1][k]

- p[i - 1][j + 1][k] + p[i - 1][j - 1][k]

+ p[i][j + 1][k + 1] - p[i][j - 1][k + 1]

- p[i][j + 1][k - 1] + p[i][j - 1][k - 1]

+ p[i + 1][j][k + 1] - p[i - 1][j][k + 1]

- p[i + 1][j][k - 1] + p[i - 1][j][k - 1])

+ p[i - 1][j][k] + p[i][j - 1][k] + p[i][j][k - 1];

}

return gosa;

}



double function8( float *a, float p)

{

unsigned int j;

double s = 0.0;



#pragma omp parallel

{

#pragma omp for private (j) reduction (+:s)

for (j = 0; j < ORDER; j++) {

s += (a[j] /(j + 1));

}

}

return (s + p / VAL);

}




* This source code was highlighted with Source Code Highlighter .






рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдордЬреЗрджрд╛рд░ рдФрд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдХреЛрдб рдЕрдиреБрдХреВрд▓рди рдпреЛрдЬрдирд╛ рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░реЗрдВ:

  1. рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЕрдиреБрдХреВрд▓рди
  2. рд╡рд╛рд╕реНрддреБрдХрд▓рд╛-рд╕реНрд╡рддрдВрддреНрд░ рдЕрдиреБрдХреВрд▓рди:

    • рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рд░рд╛ I / O
    • рд╕рд╛рде рдореЗрдВ рдЪрд▓рд╛рдирд╛
    • рдХреБрд╢рд▓ рдореЗрдореЛрд░реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ, рдХреБрд╢рд▓ рдХреИрд╢рд┐рдВрдЧ
  3. рд╡рд╛рд╕реНрддреБрдХрд▓рд╛-рдЙрдиреНрдореБрдЦ рдЕрдиреБрдХреВрд▓рди:

    • рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢
    • рд╕рдВрдХреНрд░рдордг рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛
    • рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдХрд╛рд░реНрдп
    • рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдкрд░ рдЧрдгрдирд╛ рдХрд░рдирд╛
    • рдЖрджрд┐
рдФрд░ рдпрд╣ рдЕрднреА рднреА рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рдЙрдкрд░реЛрдХреНрдд Driver.c рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ рднреЗрджреНрдпрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рддрдирд╛рд╡ рдХреЗ рд╣рдЬрд╝рд╛рд░реЛрдВ рдмрд╛рд░ рддреНрд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реЛрд╖рдг рд╣реЛрдЧрд╛ред



рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред



All Articles