рд╕рдВрджрд░реНрдн рдХреА рд╢рд░реНрддреЗрдВ
рд╡рд┐рд╖рдп рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛-рдЙрдиреНрдореБрдЦ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреЛрдб рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рд▓реЛрд╢рди рдЬреЛ рдХрд┐ рдПрдХ рдЕрдирдзрд┐рдХреГрдд рд╕рдВрд╕реНрдХрд░рдг 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):
- MMX - рдкреВрд░реНрдгрд╛рдВрдХ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг (64-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░)
- 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 .
рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдордЬреЗрджрд╛рд░ рдФрд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдХреЛрдб рдЕрдиреБрдХреВрд▓рди рдпреЛрдЬрдирд╛ рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░реЗрдВ:
- рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЕрдиреБрдХреВрд▓рди
- рд╡рд╛рд╕реНрддреБрдХрд▓рд╛-рд╕реНрд╡рддрдВрддреНрд░ рдЕрдиреБрдХреВрд▓рди:
- рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рд░рд╛ I / O
- рд╕рд╛рде рдореЗрдВ рдЪрд▓рд╛рдирд╛
- рдХреБрд╢рд▓ рдореЗрдореЛрд░реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ, рдХреБрд╢рд▓ рдХреИрд╢рд┐рдВрдЧ
- рд╡рд╛рд╕реНрддреБрдХрд▓рд╛-рдЙрдиреНрдореБрдЦ рдЕрдиреБрдХреВрд▓рди:
- рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢
- рд╕рдВрдХреНрд░рдордг рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛
- рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдХрд╛рд░реНрдп
- рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдкрд░ рдЧрдгрдирд╛ рдХрд░рдирд╛
- рдЖрджрд┐
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред