прогнать самописный бенчмарк на последнем core i7

NataNata

Такое дело: есть ряд некоторых вычислений огромного масштаба, которые предостоит проводить. Хочется понять, насколько быстро оно будет работать и нужно ли закладываться на покупку нового железа.
Очень хотелось бы потестить мини-вариант вычислений (работает пару секунд) на каких-нибудь зверских процах самых последних поколений. Если кто-нибудь может предоставить свою машину для запуска кода - буду очень признателен. Могу предоставить 1) .cpp код для компиляции на винде 2) .cpp код для компиляции под линуксом 3) бинарники для винды (80 кб, скомпилен под msvs 9.0) 4) бинарники для линукса.
Спасибо.
на данный момент отсортировано по средним значениям времени avg_d для double-ов. Все значения времен из последних 11 колонов даны в миллисекундах. Сильное отличие в последней колонке (0.012f) ожидаемо.
по умолчанию, для msvs командная строка /Ox /arch:SSE2 /fp:fast
по умолчанию, для g++ командная строка /O3 -mfpmath=sse -msse2 -ffast-math

N who CPU mem OS compiler commandline avg_d 1.2d 0.36d 0.12d 0.036d 0.012d 1.2f 0.36f 0.12f 0.036f 0.012f
1 core i7 2630QM linux (parallel) icc icc -parallel -static -fast 150.4 133 159 149 145 166 134 143 172 147 158
2 core i7 2630QM linux (parallel) icc icc -parallel -static -O3 185.4 169 212 189 187 170 162 184 152 170 188
3 core i7 2630QM linux (parallel) icc icc -parallel -static 189 193 215 180 169 188 147 162 222 167 233
4 xeon E5450 3 GHz (x2) 8 linux 64 (parallel) icc icc -openmp -parallel -ipo -no-prec-div -xHost -O3 195.2 177 177 225 185 212 99 99 99 99 132
5 xeon X5650 2.67 GHz (parallel) 196 163 159 181 287 190 769 768 768 774 701
6 xeon X3430 2.4 GHz (parallel) utlcc -O3 -ffast-math 238 238 238 238 238 238 848 848 848 855 756
7 AlexSA core i7 930 3 GHz 12 win 2k3 64 msvs 653.2 641 656 641 672 656 641 656 672 734 2547
8 Phenom II X4 955 3.6 vmware xp msvs 709.4 719 703 703 703 719 688 688 688 703 891
9 xeon X5650 2.67 GHz 709.8 715 705 719 705 705 690 690 690 695 649
10 Phenom II X4 955 3.6 virtualpc xp msvs 715 711 721 721 701 721 681 701 671 681 891
11 core i7 930 2.8 GHz 24 win 64 msvs, 32 bit code/O2 вместо /Ox 717.4 764 733 733 671 686 686 686 686 764 2683
12 Phenom II X4 955 3.6 win7 64 msvs 757 748 753 761 760 763 667 666 669 671 838
13 core 2 T5300 (parallel) icc icc -parallel -fast 770.2 783 669 791 788 820 596 723 662 612 903
14 xeon X3430 2.4 GHz g++ g++ -O3 -ffast-math 788 803 787 784 785 781 760 769 767 768 701
15 core i7 860 2.8 GHz 8 win7 64 msvs cl /Ox /fp:fast 791.6 795 790 788 794 791 627 637 625 719 1783
16 core i7 930 2.67 GHz 8,667 MHz msvs /O2 вместо /Ox 792.6 983 718 718 702 842 764 733 718 811 2824
17 xeon X5650 2.67 GHz linux 64 g++ 4.3.4 798.4 799 799 799 798 797 734 734 734 739 607
18 xeon E5450 3 GHz (x2) 8 linux 64 icc icc -ipo -no-prec-div -xHost -O3 820.6 820 815 814 836 818 676 676 673 682 863
19 core 2 Q9300 2.5 GHz 3 win msvs 825 813 828 828 828 828 797 797 797 891 2906
20 core i7 2630QM 2 virtualbox win7 828 831 798 837 823 851 771 848 759 860 1095
21 core i5-2500K 3.6 GHz 831.2 829 832 833 831 831 5092 5094 5095 5091 1914
22 AlexSA core 2 Q9450 2.6 GHz 8 win2k8 R2 64 msvs 831.2 857 872 813 807 807 787 793 791 898 3108
23 AlexSA xeon E5620 2.4 GHz (x2)24 win2k8 R2 64 msvs 855.8 889 868 907 816 799 731 752 759 853 2681
24 core i7 920 3.8 GHz 867.8 869 873 874 862 861 4505 4541 4535 4537 1792
25 core i7 930 2.8 GHz win 64 msvs, 64 bit code/O2 вместо /Ox 876.6 889

juliuzz

думаю это будет всем интересно
выкладывай в общий доступ!

NataNata

блин, а чего выкладывать? это ж не бенчмарк общего назначения, это 1 итерация некоторого весьма специфического алгоритма. Смысла не вижу...

juliuzz

ну хотя бы бинарники
сможешь получить кучу результатов на различных системах от энтузиастов

Filan

Есть 3 Core i7 920 @ 3.4, 3.6, 3.8GHz.
Ещё есть Q6600 @ 3.2GHz - это не так интересно, но всё же.
Скоро должна появиться парочка Core i5-2500K - думаю на 4.5GHz заработают без проблем.
Везде Ubuntu 10.10/11.04 64bit, оперативки от 8 до 24Gb.
Выкладывай сырцы - протестирую.

okis

Очень хотелось бы потестить мини-вариант вычислений (работает пару секунд) на каких-нибудь зверских процах самых последних поколений. Если кто-нибудь может предоставить свою машину для запуска кода - буду очень признателен. Могу предоставить 1) .cpp код для компиляции на винде 2) .cpp код для компиляции под линуксом 3) бинарники для винды (80 кб, скомпилен под msvs 9.0) 4) бинарники для линукса.
есть машины q8200/8gb (win7 x32); sandy bridge 2630qm/4gb (ноут, ubuntu 11.04 x64, win7 virtualbox).

AlexV769

Intel Xeon 5530, 5570, 5620, 12G+ RAM
Intel Atom 230, 3Gb
FreeBSD :)

NataNata

Выкладываю две версии, в частности из-за того, что при описанных параметрах компилятора на моем дохлом ноуте микрософтный компилятор уделывает g++ на более мощной настольной машине, уделывает минимум на 33% по скорости выполнения, причины я не понимаю.
Код для линукса (компилил, как g++ -O3 -ffast-math -mfpmath=sse -msse2):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include <unistd.h>
#include <sys/time.h>


int _randseed;
double myrandom(int * randseed)
{
(*randseed) = (0x08088405 * (*randseed) + 1) & 0x7fffffff;
return *randseed) / pow(2.,31 * 1. - 0.);
};


int myintrandom(int * randseed, int themax)
{
(*randseed) = (0x08088405 * (*randseed) + 1) & 0x7fffffff;
return *randseed) % themax);
};


//variables are not inside int main due to 'stack overflow'

const int trnInputN = 500000;
const int trnInputDim = 10;
const int proInputN = 50;

//input trn
double htrnX[trnInputN][trnInputDim];
double h2trnXLinear[trnInputDim * trnInputN];
// output trn
double htrnY[trnInputN];

// input trn float
float htrnXFloat[trnInputN][trnInputDim];
float h2trnXLinearFloat[trnInputDim * trnInputN];
// output trn
float htrnYFloat[trnInputN];


//input pro
double hproX[proInputN][trnInputDim];
double h2proX[trnInputDim][proInputN];
double h2proXLinear[proInputN * trnInputDim];
//output pro
double hproY[proInputN];
//output pro cpu
double hproYCPU[proInputN];
//output pro new
double hproY2[proInputN];

//input pro
float hproXFloat[proInputN][trnInputDim];
float h2proXFloat[trnInputDim][proInputN];
float h2proXLinearFloat[proInputN * trnInputDim];
//output pro
float hproYFloat[proInputN];
//output pro cpu
float hproYCPUFloat[proInputN];
//output pro new
float hproY2Float[proInputN];

////

void calcDouble(double sigma)
{
struct timeval start, end;
long mtime, seconds, useconds;
gettimeofday(&start, NULL);


for (int k = 0; k < proInputN; k++)
{
double q2 = 0.0f;
double q3 = 0.0f;
for (int i = 0; i < trnInputN; i++)
{
double q = 0.0f;
for (int j = 0; j < trnInputDim; j++)
{
double q1 = htrnX[i][j] - hproX[k][j];
q += q1 * q1;
}

q = exp(-q / sigma);

q2 += q * htrnY[i];
q3 += q;
}

hproYCPU[k] = q2 / q3;
}

gettimeofday(&end, NULL);
seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;
mtime = seconds) * 1000 + useconds/1000.0) + 0.5;
printf("Elapsed time double for %f: %ld milliseconds\n", (float)sigma, mtime);

}

void calcFloat(float sigmaFloat)
{
struct timeval start, end;
long mtime, seconds, useconds;
gettimeofday(&start, NULL);


for (int k = 0; k < proInputN; k++)
{
float q2 = 0.0f;
float q3 = 0.0f;
for (int i = 0; i < trnInputN; i++)
{
float q = 0.0f;
for (int j = 0; j < trnInputDim; j++)
{
float q1 = htrnXFloat[i][j] - hproXFloat[k][j];
q += q1 * q1;
}

q = expf(-q / sigmaFloat);

q2 += q * htrnYFloat[i];
q3 += q;
}

hproYCPUFloat[k] = q2 / q3;
}

gettimeofday(&end, NULL);
seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;
mtime = seconds) * 1000 + useconds/1000.0) + 0.5;
printf("Elapsed time float %f: %ld milliseconds\n", sigmaFloat, mtime);

}


/* Main */
int main(int argc, char** argv)
{
//// fill with random data



int randseed = 111;
for (int i = 0; i < trnInputN; i++)
{
for (int j = 0; j < trnInputDim; j++)
{
htrnX[i][j] = myrandom(&randseed);
h2trnXLinear[j * trnInputN + i] = htrnX[i][j];

htrnXFloat[i][j] = (floathtrnX[i][j]);
h2trnXLinearFloat[j * trnInputN + i] = (floath2trnXLinear[j * trnInputN + i]);
}

htrnY[i] = myrandom(&randseed);
htrnYFloat[i] = (floathtrnY[i]);
}

for (int i = 0; i < proInputN; i++)
{
for (int j = 0; j < trnInputDim; j++)
{
hproX[i][j] = myrandom(&randseed);
h2proX[j][i] = hproX[i][j];
h2proXLinear[j * proInputN + i] = hproX[i][j];

hproXFloat[i][j] = (floathproX[i][j]);
h2proXFloat[j][i] = (floath2proX[j][i]);
h2proXLinearFloat[j * proInputN + i] = (floath2proXLinear[j * proInputN + i]);
}

hproY[i] = 0;
hproYFloat[i] = 0;
}

//////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////
//// part 2
calcDouble(1.2); calcDouble(0.36); calcDouble(0.12); calcDouble(0.036); calcDouble(0.012);
calcFloat(1.2); calcFloat(0.36); calcFloat(0.12); calcFloat(0.036); calcFloat(0.012);

}


Код для винды (компилил через микрософтный компилятор как cl /Ox /arch:SSE2 /fp:fast):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

//#include <unistd.h>
#include <windows.h>
#include <time.h>

#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
#else
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
#endif

struct timezone
{
int tz_minuteswest; /* minutes W of Greenwich */
int tz_dsttime; /* type of dst correction */
};


int _randseed;
double myrandom(int * randseed)
{
(*randseed) = (0x08088405 * (*randseed) + 1) & 0x7fffffff;
return *randseed) / pow(2.,31 * 1. - 0.);
};


int myintrandom(int * randseed, int themax)
{
(*randseed) = (0x08088405 * (*randseed) + 1) & 0x7fffffff;
return *randseed) % themax);
};


int gettimeofday(struct timeval *tv, struct timezone *tz)
{
// Define a structure to receive the current Windows filetime
FILETIME ft;

// Initialize the present time to 0 and the timezone to UTC
unsigned __int64 tmpres = 0;
static int tzflag = 0;

if (NULL != tv)
{
GetSystemTimeAsFileTime(&ft);

// The GetSystemTimeAsFileTime returns the number of 100 nanosecond
// intervals since Jan 1, 1601 in a structure. Copy the high bits to
// the 64 bit tmpres, shift it left by 32 then or in the low 32 bits.
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;

// Convert to microseconds by dividing by 10
tmpres /= 10;

// The Unix epoch starts on Jan 1 1970. Need to subtract the difference
// in seconds from Jan 1 1601.
tmpres -= DELTA_EPOCH_IN_MICROSECS;

// Finally change microseconds to seconds and place in the seconds value.
// The modulus picks up the microseconds.
tv->tv_sec = (longtmpres / 1000000UL);
tv->tv_usec = (longtmpres % 1000000UL);
}

if (NULL != tz)
{
if (!tzflag)
{
_tzset;
tzflag++;
}

// Adjust for the timezone west of Greenwich
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}

return 0;
}





//variables are not inside int main due to 'stack overflow'

const int trnInputN = 500000;
const int trnInputDim = 10;
const int proInputN = 50;

//input trn
double htrnX[trnInputN][trnI

AlexV769


Elapsed time double for 1.200000: 1339 milliseconds
Elapsed time double for 0.360000: 1294 milliseconds
Elapsed time double for 0.120000: 1433 milliseconds
Elapsed time double for 0.036000: 1255 milliseconds
Elapsed time double for 0.012000: 1307 milliseconds
Elapsed time float 1.200000: 1097 milliseconds
Elapsed time float 0.360000: 1021 milliseconds
Elapsed time float 0.120000: 1051 milliseconds
Elapsed time float 0.036000: 1232 milliseconds
Elapsed time float 0.012000: 3431 milliseconds

Elapsed time double for 1.200000: 1006 milliseconds
Elapsed time double for 0.360000: 989 milliseconds
Elapsed time double for 0.120000: 988 milliseconds
Elapsed time double for 0.036000: 988 milliseconds
Elapsed time double for 0.012000: 988 milliseconds
Elapsed time float 1.200000: 838 milliseconds
Elapsed time float 0.360000: 807 milliseconds
Elapsed time float 0.120000: 807 milliseconds
Elapsed time float 0.036000: 907 milliseconds
Elapsed time float 0.012000: 2638 milliseconds

Elapsed time double for 1.200000: 6049 milliseconds
Elapsed time double for 0.360000: 6153 milliseconds
Elapsed time double for 0.120000: 6162 milliseconds
Elapsed time double for 0.036000: 6291 milliseconds
Elapsed time double for 0.012000: 6140 milliseconds
Elapsed time float 1.200000: 4525 milliseconds
Elapsed time float 0.360000: 4458 milliseconds
Elapsed time float 0.120000: 4499 milliseconds
Elapsed time float 0.036000: 4817 milliseconds
Elapsed time float 0.012000: 7730 milliseconds

NataNata

еще результаты (спасибо )
core 2 t5300 / 3gb, g++
Elapsed time double for 1.200000: 2329 milliseconds
Elapsed time double for 0.360000: 2251 milliseconds
Elapsed time double for 0.120000: 2326 milliseconds
Elapsed time double for 0.036000: 2345 milliseconds
Elapsed time double for 0.012000: 2248 milliseconds
Elapsed time float 1.200000: 12506 milliseconds
Elapsed time float 0.360000: 12454 milliseconds
Elapsed time float 0.120000: 12441 milliseconds
Elapsed time float 0.036000: 12422 milliseconds
Elapsed time float 0.012000: 4745 milliseconds
результаты с моего ноута (core i2 t7500, 2 gb, msvs, без ключа /fp:fast)
Elapsed time double for 1.200000: 1764 milliseconds
Elapsed time double for 0.360000: 1770 milliseconds
Elapsed time double for 0.120000: 1765 milliseconds
Elapsed time double for 0.036000: 1772 milliseconds
Elapsed time double for 0.012000: 1774 milliseconds
Elapsed time float 1.200000: 3827 milliseconds
Elapsed time float 0.360000: 3820 milliseconds
Elapsed time float 0.120000: 3867 milliseconds
Elapsed time float 0.036000: 3989 milliseconds
Elapsed time float 0.012000: 7647 milliseconds
результаты с моего ноута (core i2 t7500, 2 gb, msvs, с ключом /fp:fast)
Elapsed time double for 1.200000: 984 milliseconds
Elapsed time double for 0.360000: 970 milliseconds
Elapsed time double for 0.120000: 949 milliseconds
Elapsed time double for 0.036000: 971 milliseconds
Elapsed time double for 0.012000: 954 milliseconds
Elapsed time float 1.200000: 918 milliseconds
Elapsed time float 0.360000: 929 milliseconds
Elapsed time float 0.120000: 922 milliseconds
Elapsed time float 0.036000: 1040 milliseconds
Elapsed time float 0.012000: 3206 milliseconds
з.ы. попозже соберу в табличку

NataNata

intel core 2 quad 6600 2.4 GHz, 8 gb, g++ -O3 -msse3 -mfpmath=sse -funroll-loops -ftree-vectorize -ffast-math
Elapsed time double for 1.200000: 1275 milliseconds
Elapsed time double for 0.360000: 1275 milliseconds
Elapsed time double for 0.120000: 1275 milliseconds
Elapsed time double for 0.036000: 1275 milliseconds
Elapsed time double for 0.012000: 1275 milliseconds
Elapsed time float 1.200000: 9163 milliseconds
Elapsed time float 0.360000: 9163 milliseconds
Elapsed time float 0.120000: 9163 milliseconds
Elapsed time float 0.036000: 9150 milliseconds
Elapsed time float 0.012000: 3622 milliseconds

NataNata

xeon E5620, 2.4 GHz
$ g++ -O3 -mfpmath=sse -msse4 -ffast-math
Elapsed time double for 1.200000: 1234 milliseconds
Elapsed time double for 0.360000: 1235 milliseconds
Elapsed time double for 0.120000: 1234 milliseconds
Elapsed time double for 0.036000: 1235 milliseconds
Elapsed time double for 0.012000: 1235 milliseconds
Elapsed time float 1.200000: 6348 milliseconds
Elapsed time float 0.360000: 6348 milliseconds
Elapsed time float 0.120000: 6348 milliseconds
Elapsed time float 0.036000: 6339 milliseconds
Elapsed time float 0.012000: 2489 milliseconds
З.ы. почему-то g++ сильно проседает на float-ах...

Terrk

Core 2 Quad Q9300 2.5 GHz, 3 Gb
cl /Ox /arch:SSE2 /fp:fast

Elapsed time double for 1.200000: 813 milliseconds
Elapsed time double for 0.360000: 828 milliseconds
Elapsed time double for 0.120000: 828 milliseconds
Elapsed time double for 0.036000: 828 milliseconds
Elapsed time double for 0.012000: 828 milliseconds
Elapsed time float 1.200000: 797 milliseconds
Elapsed time float 0.360000: 797 milliseconds
Elapsed time float 0.120000: 797 milliseconds
Elapsed time float 0.036000: 891 milliseconds
Elapsed time float 0.012000: 2906 milliseconds

Без ключа /fp:fast:

Elapsed time double for 1.200000: 1406 milliseconds
Elapsed time double for 0.360000: 1391 milliseconds
Elapsed time double for 0.120000: 1391 milliseconds
Elapsed time double for 0.036000: 1391 milliseconds
Elapsed time double for 0.012000: 1391 milliseconds
Elapsed time float 1.200000: 2391 milliseconds
Elapsed time float 0.360000: 2391 milliseconds
Elapsed time float 0.120000: 2391 milliseconds
Elapsed time float 0.036000: 2516 milliseconds
Elapsed time float 0.012000: 5563 milliseconds

serega1604

 X3450 @ 2.67GHz g++ linux/amd64
Elapsed time double for 1.200000: 1213 milliseconds
Elapsed time double for 0.360000: 1213 milliseconds
Elapsed time double for 0.120000: 1224 milliseconds
Elapsed time double for 0.036000: 1219 milliseconds
Elapsed time double for 0.012000: 1213 milliseconds
Elapsed time float 1.200000: 6385 milliseconds
Elapsed time float 0.360000: 6398 milliseconds
Elapsed time float 0.120000: 6403 milliseconds
Elapsed time float 0.036000: 6402 milliseconds
Elapsed time float 0.012000: 2584 milliseconds

NataNata

еще результаты (спасибо )
видимо, g++, если не написано иначе
Q6600 @ 3.2GHz:
Elapsed time double for 1.200000: 1206 milliseconds
Elapsed time double for 0.360000: 1212 milliseconds
Elapsed time double for 0.120000: 1215 milliseconds
Elapsed time double for 0.036000: 1216 milliseconds
Elapsed time double for 0.012000: 1215 milliseconds
Elapsed time float 1.200000: 6775 milliseconds
Elapsed time float 0.360000: 6774 milliseconds
Elapsed time float 0.120000: 6768 milliseconds
Elapsed time float 0.036000: 6757 milliseconds
Elapsed time float 0.012000: 2617 milliseconds
Core i7 920 @ 3.4GHz:
Elapsed time double for 1.200000: 966 milliseconds
Elapsed time double for 0.360000: 938 milliseconds
Elapsed time double for 0.120000: 946 milliseconds
Elapsed time double for 0.036000: 966 milliseconds
Elapsed time double for 0.012000: 951 milliseconds
Elapsed time float 1.200000: 5033 milliseconds
Elapsed time float 0.360000: 5058 milliseconds
Elapsed time float 0.120000: 5055 milliseconds
Elapsed time float 0.036000: 5040 milliseconds
Elapsed time float 0.012000: 2017 milliseconds
Core i7 920 @ 3.6GHz:
Elapsed time double for 1.200000: 937 milliseconds
Elapsed time double for 0.360000: 920 milliseconds
Elapsed time double for 0.120000: 920 milliseconds
Elapsed time double for 0.036000: 922 milliseconds
Elapsed time double for 0.012000: 922 milliseconds
Elapsed time float 1.200000: 4809 milliseconds
Elapsed time float 0.360000: 4808 milliseconds
Elapsed time float 0.120000: 4806 milliseconds
Elapsed time float 0.036000: 4798 milliseconds
Elapsed time float 0.012000: 1894 milliseconds
Core i7 920 @ 3.8GHz:
Elapsed time double for 1.200000: 869 milliseconds
Elapsed time double for 0.360000: 873 milliseconds
Elapsed time double for 0.120000: 874 milliseconds
Elapsed time double for 0.036000: 862 milliseconds
Elapsed time double for 0.012000: 861 milliseconds
Elapsed time float 1.200000: 4505 milliseconds
Elapsed time float 0.360000: 4541 milliseconds
Elapsed time float 0.120000: 4535 milliseconds
Elapsed time float 0.036000: 4537 milliseconds
Elapsed time float 0.012000: 1792 milliseconds
Core 2 Duo E7200 @ 3.4GHz FreeBSD 8.2 i386:
Elapsed time double for 1.200000: 1545 milliseconds
Elapsed time double for 0.360000: 1546 milliseconds
Elapsed time double for 0.120000: 1546 milliseconds
Elapsed time double for 0.036000: 1544 milliseconds
Elapsed time double for 0.012000: 1547 milliseconds
Elapsed time float 1.200000: 1046 milliseconds
Elapsed time float 0.360000: 1050 milliseconds
Elapsed time float 0.120000: 1050 milliseconds
Elapsed time float 0.036000: 1194 milliseconds
Elapsed time float 0.012000: 3473 milliseconds
Xeon X3430 2.4GHz FreeBSD 8.2 amd64:
Elapsed time double for 1.200000: 1183 milliseconds
Elapsed time double for 0.360000: 1160 milliseconds
Elapsed time double for 0.120000: 1159 milliseconds
Elapsed time double for 0.036000: 1159 milliseconds
Elapsed time double for 0.012000: 1159 milliseconds
Elapsed time float 1.200000: 983 milliseconds
Elapsed time float 0.360000: 949 milliseconds
Elapsed time float 0.120000: 948 milliseconds
Elapsed time float 0.036000: 1070 milliseconds
Elapsed time float 0.012000: 3204 milliseconds

Filan

-funroll-loops
Оно только тормозит на E7200 @ 3.4GHz FreeBSD 8.2 i386 gcc 4.5.
Быстрее всего c:
g++45 -O3 -mfpmath=sse -msse3 -ffast-math -mtune=core2 -march=core2 -o test45-core2 test.cpp
Elapsed time double for 1.200000: 1520 milliseconds
Elapsed time double for 0.360000: 1520 milliseconds
Elapsed time double for 0.120000: 1520 milliseconds
Elapsed time double for 0.036000: 1520 milliseconds
Elapsed time double for 0.012000: 1518 milliseconds
Elapsed time float 1.200000: 982 milliseconds
Elapsed time float 0.360000: 966 milliseconds
Elapsed time float 0.120000: 965 milliseconds
Elapsed time float 0.036000: 1109 milliseconds
Elapsed time float 0.012000: 3385 milliseconds

okis

q8200 2.3ghz, 8gb, windows 7
Elapsed time double for 1.200000: 923 milliseconds
Elapsed time double for 0.360000: 928 milliseconds
Elapsed time double for 0.120000: 927 milliseconds
Elapsed time double for 0.036000: 929 milliseconds
Elapsed time double for 0.012000: 924 milliseconds
Elapsed time float 1.200000: 886 milliseconds
Elapsed time float 0.360000: 885 milliseconds
Elapsed time float 0.120000: 886 milliseconds
Elapsed time float 0.036000: 996 milliseconds
Elapsed time float 0.012000: 3208 milliseconds

NataNata

Быстрее всего c:
g++45 -O3 -mfpmath=sse -msse3 -ffast-math -mtune=core2 -march=core2 -o test45-core2 test.cpp
Как я ни пытался, но ни на redhat-е, ни на debian-е я не смог получить результата, чтобы скорость теста для float был быстрее\равен скорость для double-ов. А на freebsd, кстати, все пучком. Хотя есть подозрение, что это из-за 64-битности линуксов и 32-битности freebsd.

Filan

Хотя есть подозрение, что это из-за 64-битности линуксов и 32-битности freebsd.
У меня FreeBSD на 64bit тоже есть. Так что версия не подтверждается...

NataNata

У меня FreeBSD на 64bit тоже есть. Так что версия не подтверждается...
ну и ладно, тем более, что в дизассемблер все равно лень лезть

Filan

Pentium 2 266MHz 224Mb FreeBSD 8.2 i386 системный gcc 4.2.1:
g++ -O3 -mfpmath=387 -ffast-math -mtune=pentium2 -march=pentium2 -o test-pentium2 test.cpp
Elapsed time double for 1.200000: 30288 milliseconds
Elapsed time double for 0.360000: 29915 milliseconds
Elapsed time double for 0.120000: 30297 milliseconds
Elapsed time double for 0.036000: 30266 milliseconds
Elapsed time double for 0.012000: 30410 milliseconds
Elapsed time float 1.200000: 27862 milliseconds
Elapsed time float 0.360000: 27774 milliseconds
Elapsed time float 0.120000: 28135 milliseconds
Elapsed time float 0.036000: 27821 milliseconds
Elapsed time float 0.012000: 27717 milliseconds

Filan

А у тебя какое сейчас железо и какие результаты?
Я правильно понял, что ты забумал апгрейдить комп и решаешь на сколько это целесообразно?

NataNata

core 2 quad сейчас стоит. И еще ноут core 2 T7500. Результаты есть в посте.
Я правильно понял, что ты забумал апгрейдить комп и решаешь на сколько это целесообразно?
да
Просто говорили тут, core i7, мол, новый контроллер памяти, ляля, ну я и подумал про попробовать.

Filan

Просто говорили тут, core i7, мол, новый контроллер памяти, ляля, ну я и подумал про попробовать.
Ну так и посмотри на разницу Core i7 920 и твоего Q6600 - в полтора раза точно, а ещё гипертрединг на твоих тестах + порядка 40%.
А Xeon у тебя и так "на ядре нахелем" 32нм.
Тебе надо посмотреть результаты сандиков - это Xeon E-* и Core i5/7 2x00.
Думаю будет быстрее ещё процентов на 20-30.

Anna83


model name : AMD Phenom(tm) II X6 1055T Processor
cpu MHz : 3429.898
gcc версия 4.5.2
g++ -O3 -ffast-math -mfpmath=sse -msse2 -msse4.1 bench.cpp -o bench
Elapsed time double for 1.200000: 1019 milliseconds
Elapsed time double for 0.360000: 1019 milliseconds
Elapsed time double for 0.120000: 1020 milliseconds
Elapsed time double for 0.036000: 1019 milliseconds
Elapsed time double for 0.012000: 1020 milliseconds
Elapsed time float 1.200000: 4916 milliseconds
Elapsed time float 0.360000: 4916 milliseconds
Elapsed time float 0.120000: 4916 milliseconds
Elapsed time float 0.036000: 4910 milliseconds
Elapsed time float 0.012000: 2048 milliseconds


model name : AMD Athlon(tm) 64 Processor 3200+
cpu MHz : 2400.493
gcc версия 4.4.5
g++ -O3 -ffast-math -mfpmath=sse -msse2 bench.cpp -o bench
Elapsed time double for 1.200000: 1900 milliseconds
Elapsed time double for 0.360000: 1910 milliseconds
Elapsed time double for 0.120000: 1909 milliseconds
Elapsed time double for 0.036000: 1907 milliseconds
Elapsed time double for 0.012000: 1905 milliseconds
Elapsed time float 1.200000: 7618 milliseconds
Elapsed time float 0.360000: 7620 milliseconds
Elapsed time float 0.120000: 7602 milliseconds
Elapsed time float 0.036000: 7600 milliseconds
Elapsed time float 0.012000: 3212 milliseconds

NataNata

вот интересны именно последние core i7
более того, синтетические тесты - одно, а запчасть от своей проги - другое

Filan

Как будет сандик под рукой (уже говорил, что в течении недели) - обязательно протестирую.

AlexV769

cpu0: Sun Microsystems UltraSparc-IIe Processor (648.00 MHz CPU)
FreeBSD 8.2-STABLE sparc64, системный g++ 4.2.1
g++ -O3 -ffast-math -funroll-loops -ftree-vectorize
Elapsed time double for 1.200000: 21607 milliseconds
Elapsed time double for 0.360000: 21985 milliseconds
Elapsed time double for 0.120000: 21947 milliseconds
Elapsed time double for 0.036000: 21988 milliseconds
Elapsed time double for 0.012000: 22025 milliseconds
Elapsed time float 1.200000: 13025 milliseconds
Elapsed time float 0.360000: 13536 milliseconds
Elapsed time float 0.120000: 13455 milliseconds
Elapsed time float 0.036000: 13683 milliseconds
Elapsed time float 0.012000: 10353 milliseconds

ppplva

Core i5-2500K @3600 Mhz
Elapsed time double for 1.200000: 829 milliseconds
Elapsed time double for 0.360000: 832 milliseconds
Elapsed time double for 0.120000: 833 milliseconds
Elapsed time double for 0.036000: 831 milliseconds
Elapsed time double for 0.012000: 831 milliseconds
Elapsed time float 1.200000: 5092 milliseconds
Elapsed time float 0.360000: 5094 milliseconds
Elapsed time float 0.120000: 5095 milliseconds
Elapsed time float 0.036000: 5091 milliseconds
Elapsed time float 0.012000: 1914 milliseconds

slonishka

bugaga ~ $ g++ -O3 -mfpmath=sse -msse3 -ffast-math -mtune=core2 -march=core2 test.cpp 
bugaga ~ $ ./a.out
Elapsed time double for 1.200000: 2600 milliseconds
Elapsed time double for 0.360000: 2598 milliseconds
Elapsed time double for 0.120000: 2597 milliseconds
Elapsed time double for 0.036000: 2597 milliseconds
Elapsed time double for 0.012000: 2599 milliseconds
Elapsed time float 1.200000: 2523 milliseconds
Elapsed time float 0.360000: 2517 milliseconds
Elapsed time float 0.120000: 2519 milliseconds
Elapsed time float 0.036000: 2655 milliseconds
Elapsed time float 0.012000: 6493 milliseconds
bugaga ~ $ uname -a
Linux bugaga 2.6.34-gentoo-r12 SMP PREEMPT Wed Nov 17 22:46:46 MSK 2010 i686 Intel(R) Core(TM)2 CPU T7400 @ 2.16GHz GenuineIntel GNU/Linux
bugaga ~ $ gcc --version
gcc (Gentoo 4.5.2 p1.0, pie-0.4.5) 4.5.2

памяти 2 гига.

Filan

Core i5-2500K @3600 Mhz
Elapsed time double for 1.200000: 829 milliseconds
Elapsed time double for 0.360000: 832 milliseconds
Elapsed time double for 0.120000: 833 milliseconds
Elapsed time double for 0.036000: 831 milliseconds
Elapsed time double for 0.012000: 831 milliseconds
Elapsed time float 1.200000: 5092 milliseconds
Elapsed time float 0.360000: 5094 milliseconds
Elapsed time float 0.120000: 5095 milliseconds
Elapsed time float 0.036000: 5091 milliseconds
Elapsed time float 0.012000: 1914 milliseconds
Опа - даблы чуть лучше, чем на i7 920 @ 3.6, а флоаты чуть хуже.
Но это один процесс. А вот 8 на нахелеме, по всей видимости, будут побыстрее. Правда 920 особо сильнее не погонишь, а 2500K ещё +1GHz только в путь.
4.5GHz не будешь делать?

Filan

bugaga ~ $ g++ -O3 -mfpmath=sse -msse3 -ffast-math -mtune=core2 -march=core2 test.cpp
gcc --version
У тебя одного на линуксе, как это ни странно, даблы и флоаты близки.
Такие результаты вижу только на FreeBSD и win.

Dasar

intel core i7 cpu 930 2.8GHz, 24GB, msvc /fp:fast /arch:SSE2 /O2

Elapsed time double for 1.200000: 764 milliseconds
Elapsed time double for 0.360000: 733 milliseconds
Elapsed time double for 0.120000: 733 milliseconds
Elapsed time double for 0.036000: 671 milliseconds
Elapsed time double for 0.012000: 686 milliseconds
Elapsed time float 1.200000: 686 milliseconds
Elapsed time float 0.360000: 686 milliseconds
Elapsed time float 0.120000: 686 milliseconds
Elapsed time float 0.036000: 764 milliseconds
Elapsed time float 0.012000: 2683 milliseconds

та же машина, но 64-битное приложение
intel core i7 cpu 930 2.8GHz, 24GB, msvc /fp:fast /arch:SSE2 /O2 x64

Elapsed time double for 1.200000: 889 milliseconds
Elapsed time double for 0.360000: 811 milliseconds
Elapsed time double for 0.120000: 811 milliseconds
Elapsed time double for 0.036000: 983 milliseconds
Elapsed time double for 0.012000: 889 milliseconds
Elapsed time float 1.200000: 593 milliseconds
Elapsed time float 0.360000: 608 milliseconds
Elapsed time float 0.120000: 593 milliseconds
Elapsed time float 0.036000: 702 milliseconds
Elapsed time float 0.012000: 2090 milliseconds

amd athlon 64 x2 dual core 3800+ 2GHz 4GB, msvc /fp:fast /arch:SSE2 /O2

Elapsed time double for 1.200000: 1406 milliseconds
Elapsed time double for 0.360000: 1406 milliseconds
Elapsed time double for 0.120000: 1406 milliseconds
Elapsed time double for 0.036000: 1422 milliseconds
Elapsed time double for 0.012000: 1406 milliseconds
Elapsed time float 1.200000: 1406 milliseconds
Elapsed time float 0.360000: 1406 milliseconds
Elapsed time float 0.120000: 1406 milliseconds
Elapsed time float 0.036000: 1438 milliseconds
Elapsed time float 0.012000: 1734 milliseconds

intel core i7 cpu 920 2.67GHz, 8GB, msvc /fp:fast /arch:SSE2 /O2

Elapsed time double for 1.200000: 983 milliseconds
Elapsed time double for 0.360000: 718 milliseconds
Elapsed time double for 0.120000: 718 milliseconds
Elapsed time double for 0.036000: 702 milliseconds
Elapsed time double for 0.012000: 842 milliseconds
Elapsed time float 1.200000: 764 milliseconds
Elapsed time float 0.360000: 733 milliseconds
Elapsed time float 0.120000: 718 milliseconds
Elapsed time float 0.036000: 811 milliseconds
Elapsed time float 0.012000: 2824 milliseconds

другой с таким же конфигом (чуть другая память и другая ревизия чипсета)
intel core i7 cpu 920 2.67GHz, 8GB, msvc /fp:fast /arch:SSE2 /O2

Elapsed time double for 1.200000: 1108 milliseconds
Elapsed time double for 0.360000: 1092 milliseconds
Elapsed time double for 0.120000: 1108 milliseconds
Elapsed time double for 0.036000: 952 milliseconds
Elapsed time double for 0.012000: 983 milliseconds
Elapsed time float 1.200000: 1030 milliseconds
Elapsed time float 0.360000: 1030 milliseconds
Elapsed time float 0.120000: 1076 milliseconds
Elapsed time float 0.036000: 1076 milliseconds
Elapsed time float 0.012000: 4243 milliseconds

intel celeron 2.4, 0.76GB, msvc /fp:fast /arch:SSE2 /O2

Elapsed time double for 1.200000: 1969 milliseconds
Elapsed time double for 0.360000: 1953 milliseconds
Elapsed time double for 0.120000: 1953 milliseconds
Elapsed time double for 0.036000: 1922 milliseconds
Elapsed time double for 0.012000: 1984 milliseconds
Elapsed time float 1.200000: 1625 milliseconds
Elapsed time float 0.360000: 1625 milliseconds
Elapsed time float 0.120000: 1656 milliseconds
Elapsed time float 0.036000: 2313 milliseconds
Elapsed time float 0.012000: 15000 milliseconds

Filan

OMG:
$ g++ -O3 -mfpmath=both -msse3 -ffast-math -mtune=core2 -march=core2 -o test-core2 test.cpp
$ ./test-core2
Elapsed time double for 1.200000: 1705 milliseconds
Elapsed time double for 0.360000: 1702 milliseconds
Elapsed time double for 0.120000: 1695 milliseconds
Elapsed time double for 0.036000: 1697 milliseconds
Elapsed time double for 0.012000: 1696 milliseconds
Elapsed time float 1.200000: 1639 milliseconds
Elapsed time float 0.360000: 1646 milliseconds
Elapsed time float 0.120000: 1646 milliseconds
Elapsed time float 0.036000: 1647 milliseconds
Elapsed time float 0.012000: 1650 milliseconds
$ g++ -O3 -mfpmath=387 -msse3 -ffast-math -mtune=core2 -march=core2 -o test-core2 test.cpp
$ ./test-core2
Elapsed time double for 1.200000: 1526 milliseconds
Elapsed time double for 0.360000: 1525 milliseconds
Elapsed time double for 0.120000: 1524 milliseconds
Elapsed time double for 0.036000: 1528 milliseconds
Elapsed time double for 0.012000: 1526 milliseconds
Elapsed time float 1.200000: 1492 milliseconds
Elapsed time float 0.360000: 1481 milliseconds
Elapsed time float 0.120000: 1481 milliseconds
Elapsed time float 0.036000: 1484 milliseconds
Elapsed time float 0.012000: 1484 milliseconds
$ g++ -O3 -mfpmath=sse -msse3 -ffast-math -mtune=core2 -march=core2 -o test-core2 test.cpp
$ ./test-core2
Elapsed time double for 1.200000: 1211 milliseconds
Elapsed time double for 0.360000: 1211 milliseconds
Elapsed time double for 0.120000: 1211 milliseconds
Elapsed time double for 0.036000: 1210 milliseconds
Elapsed time double for 0.012000: 1205 milliseconds
Elapsed time float 1.200000: 6778 milliseconds
Elapsed time float 0.360000: 6773 milliseconds
Elapsed time float 0.120000: 6773 milliseconds
Elapsed time float 0.036000: 6764 milliseconds
Elapsed time float 0.012000: 2631 milliseconds
P.S. Это Q6600 @ 400*8=3.2GHz.

ppplva

4.5GHz не будешь делать?
Подумываю. Можешь кинуть ссылок на грамотные материалы по разгону "для нубов"?

Filan

С сандиком всё предельно просто - гонится только множителем. Надеюсь у тебя мама на P67 или Z68, а не на H67?
Фиксируешь все напряжения на дефолте, в том числе CPU.
Далее повышаешь множитель CPU и при необходимости напряжение на CPU для достижения стабильности. Тестишь LinX на пол часика и смотришь температуру в эвересте каком-нибудь (да, пока разгон проще делать под мастдаями). Если температура в нагрузке < 80C, то смело можно повышать множитель дальше. Стабильность потерял - повышай чуток напряжение. Ну температура чтобы была в пределах 90C в нагрузке. Ну и напряжение выше 1.35V я бы не стал ставить. AFAIK, сандики раньше упираются не в температуру, а в стабильность при допустимом напряжении. Когда решил, что всё - ставь LinX на ночь.
Потом можно погнать память до 1600MHz CL8 1.65V - тестить memtest-ом.
P.S. Думаю гугл легко найдёт парочку-троечку мануалов по разгону сандиков.

slonishka

gcc --version
поправил пост, у меня 4.5.2
У тебя одного на линуксе, как это ни странно, даблы и флоаты близки.
Такие результаты вижу только на FreeBSD и win.
а почему так?
интуитивно полагаю, что это НЕ связано с версией gcc.
но я не читал код, иначе, может быть, изменил бы свое мнение.

juliuzz

win7 prof x64
core 2 duo 2133 MHz

D:\temp>g++ --version
g++ (GCC) 3.4.5 (mingw-vista special r3)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


D:\temp>g++ -O3 -ffast-math test.cpp -o test
test.cpp: In function `void calcDouble(double)':
test.cpp:100: warning: converting to `long int' from `double'
test.cpp: In function `void calcFloat(float)':
test.cpp:137: warning: converting to `long int' from `double'

D:\temp>test
Elapsed time double for 1.200000: 2542 milliseconds
Elapsed time double for 0.360000: 2523 milliseconds
Elapsed time double for 0.120000: 2516 milliseconds
Elapsed time double for 0.036000: 2567 milliseconds
Elapsed time double for 0.012000: 2519 milliseconds
Elapsed time float 1.200000: 2514 milliseconds
Elapsed time float 0.360000: 2483 milliseconds
Elapsed time float 0.120000: 2510 milliseconds
Elapsed time float 0.036000: 2574 milliseconds
Elapsed time float 0.012000: 5523 milliseconds

NataNata

свел все в табличку в 1 посте

elenangel


Intel(R) Core(TM)2 Duo CPU T5850 @ 2.16GHz
RAM 2GB
Linux 2.6.35-28-generic #50-Ubuntu SMP Fri Mar 18 19:00:26 UTC 2011 i686 GNU/Linux (32 bit)
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
g++ -O3 -ffast-math -mfpmath=sse -msse2 bench.cpp -o bench



Elapsed time double for 1.200000: 2676 milliseconds
Elapsed time double for 0.360000: 2671 milliseconds
Elapsed time double for 0.120000: 2668 milliseconds
Elapsed time double for 0.036000: 2658 milliseconds
Elapsed time double for 0.012000: 2663 milliseconds
Elapsed time float 1.200000: 2589 milliseconds
Elapsed time float 0.360000: 2588 milliseconds
Elapsed time float 0.120000: 2590 milliseconds
Elapsed time float 0.036000: 2751 milliseconds
Elapsed time float 0.012000: 6494 milliseconds

 

model name : Intel(R) Core(TM)2 Duo CPU T5850 @ 2.16GHz
RAM 2GB
Linux 2.6.35-28-generic #50-Ubuntu SMP Fri Mar 18 18:42:20 UTC 2011 x86_64 GNU/Linux (64 bit)
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

Elapsed time double for 1.200000: 1732 milliseconds
Elapsed time double for 0.360000: 1735 milliseconds
Elapsed time double for 0.120000: 1738 milliseconds
Elapsed time double for 0.036000: 1737 milliseconds
Elapsed time double for 0.012000: 1737 milliseconds
Elapsed time float 1.200000: 9996 milliseconds
Elapsed time float 0.360000: 9989 milliseconds
Elapsed time float 0.120000: 9990 milliseconds
Elapsed time float 0.036000: 9973 milliseconds
Elapsed time float 0.012000: 3853 milliseconds


Makc500

g++ -O3 -ffast-math -mfpmath=sse -msse2 test.cpp
~~~~~~~~~~~~~~~~~~~~~~~~~~
model name : Intel(R) Xeon(R) CPU X5650 @ 2.67GHz
stepping : 2
cpu MHz : 2666.000
Linux 2.6.32.36-0.5-default SMP 2011-04-14 10:12:31 +0200 x86_64 x86_64 x86_64 GNU/Linux
g++ (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]
Elapsed time double for 1.200000: 799 milliseconds
Elapsed time double for 0.360000: 799 milliseconds
Elapsed time double for 0.120000: 799 milliseconds
Elapsed time double for 0.036000: 798 milliseconds
Elapsed time double for 0.012000: 797 milliseconds
Elapsed time float 1.200000: 734 milliseconds
Elapsed time float 0.360000: 734 milliseconds
Elapsed time float 0.120000: 734 milliseconds
Elapsed time float 0.036000: 739 milliseconds
Elapsed time float 0.012000: 607 milliseconds
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
model name : AMD Opteron(tm) Processor 252
stepping : 1
cpu MHz : 2605.953
Linux 2.6.5-7.325-smp SMP Tue Jan 18 23:36:49 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
Elapsed time double for 1.200000: 2487 milliseconds
Elapsed time double for 0.360000: 2251 milliseconds
Elapsed time double for 0.120000: 2354 milliseconds
Elapsed time double for 0.036000: 2259 milliseconds
Elapsed time double for 0.012000: 2350 milliseconds
Elapsed time float 1.200000: 1888 milliseconds
Elapsed time float 0.360000: 1842 milliseconds
Elapsed time float 0.120000: 1927 milliseconds
Elapsed time float 0.036000: 2054 milliseconds
Elapsed time float 0.012000: 2133 milliseconds
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
model name : AMD Opteron(tm) Processor 248
stepping : 10
cpu MHz : 2205.058
Linux 2.6.5-7.325-smp SMP Tue Jan 18 23:36:49 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
Elapsed time double for 1.200000: 2868 milliseconds
Elapsed time double for 0.360000: 2703 milliseconds
Elapsed time double for 0.120000: 2828 milliseconds
Elapsed time double for 0.036000: 2813 milliseconds
Elapsed time double for 0.012000: 2949 milliseconds
Elapsed time float 1.200000: 2219 milliseconds
Elapsed time float 0.360000: 2204 milliseconds
Elapsed time float 0.120000: 2200 milliseconds
Elapsed time float 0.036000: 2274 milliseconds
Elapsed time float 0.012000: 2501 milliseconds

SmoKing

Забавные результаты кстати :
Процессор за 10к р. i7 и 0-500р AMD X64 3800 показываю разницу всего в 50%.
Кто нибудь по коду понял в чем причина такой маленькой разницы?

Filan

интуитивно полагаю, что это НЕ связано с версией gcc.
Взорви себе мозг :-D (FreeBSD 8.2 i386 E7200 @ 400*8.5=3400MHz):
$ g++ --version
g++ (GCC) 4.2.1 20070719 [FreeBSD]
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
$ g++ -O3 -mfpmath=387 -msse3 -ffast-math -mtune=prescott -march=prescott -o test-prescott-387 test.cpp
$ ./test-prescott-387
Elapsed time double for 1.200000: 1446 milliseconds
Elapsed time double for 0.360000: 1446 milliseconds
Elapsed time double for 0.120000: 1444 milliseconds
Elapsed time double for 0.036000: 1446 milliseconds
Elapsed time double for 0.012000: 1445 milliseconds
Elapsed time float 1.200000: 1432 milliseconds
Elapsed time float 0.360000: 1432 milliseconds
Elapsed time float 0.120000: 1431 milliseconds
Elapsed time float 0.036000: 1430 milliseconds
Elapsed time float 0.012000: 1429 milliseconds
$ g++ -O3 -mfpmath=sse -msse3 -ffast-math -mtune=prescott -march=prescott -o test-prescott-sse test.cpp
$ ./test-prescott-sse
Elapsed time double for 1.200000: 1531 milliseconds
Elapsed time double for 0.360000: 1529 milliseconds
Elapsed time double for 0.120000: 1529 milliseconds
Elapsed time double for 0.036000: 1529 milliseconds
Elapsed time double for 0.012000: 1531 milliseconds
Elapsed time float 1.200000: 1057 milliseconds
Elapsed time float 0.360000: 1066 milliseconds
Elapsed time float 0.120000: 1067 milliseconds
Elapsed time float 0.036000: 1210 milliseconds
Elapsed time float 0.012000: 3485 milliseconds
$ g++ -O3 -mfpmath=387,sse -msse3 -ffast-math -mtune=prescott -march=prescott -o test-prescott-both test.cpp
$ ./test-prescott-both
Elapsed time double for 1.200000: 1496 milliseconds
Elapsed time double for 0.360000: 1495 milliseconds
Elapsed time double for 0.120000: 1496 milliseconds
Elapsed time double for 0.036000: 1495 milliseconds
Elapsed time double for 0.012000: 1494 milliseconds
Elapsed time float 1.200000: 1570 milliseconds
Elapsed time float 0.360000: 1571 milliseconds
Elapsed time float 0.120000: 1570 milliseconds
Elapsed time float 0.036000: 1569 milliseconds
Elapsed time float 0.012000: 1571 milliseconds
$ g++45 --version
g++45 (FreeBSD Ports Collection) 4.5.4 20110526 (prerelease)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++45 -O3 -mfpmath=387 -msse3 -ffast-math -mtune=core2 -mtune=core2 -o test45-core2-387 test.cpp
$ ./test45-core2-387
Elapsed time double for 1.200000: 1412 milliseconds
Elapsed time double for 0.360000: 1411 milliseconds
Elapsed time double for 0.120000: 1413 milliseconds
Elapsed time double for 0.036000: 1413 milliseconds
Elapsed time double for 0.012000: 1412 milliseconds
Elapsed time float 1.200000: 1383 milliseconds
Elapsed time float 0.360000: 1383 milliseconds
Elapsed time float 0.120000: 1391 milliseconds
Elapsed time float 0.036000: 1383 milliseconds
Elapsed time float 0.012000: 1383 milliseconds
g++45 -O3 -mfpmath=387 -msse3 -ffast-math -mtune=core2 -mtune=core2 -o test45-core2-387 test.cpp
$ ./test45-core2-sse
Elapsed time double for 1.200000: 1517 milliseconds
Elapsed time double for 0.360000: 1517 milliseconds
Elapsed time double for 0.120000: 1517 milliseconds
Elapsed time double for 0.036000: 1516 milliseconds
Elapsed time double for 0.012000: 1516 milliseconds
Elapsed time float 1.200000: 981 milliseconds
Elapsed time float 0.360000: 965 milliseconds
Elapsed time float 0.120000: 965 milliseconds
Elapsed time float 0.036000: 1108 milliseconds
Elapsed time float 0.012000: 3378 milliseconds
$ g++45 -O3 -mfpmath=both -msse3 -ffast-math -mtune=core2 -mtune=core2 -o test45-core2-both test.cpp
$ ./test45-core2-both
Elapsed time double for 1.200000: 1571 milliseconds
Elapsed time double for 0.360000: 1573 milliseconds
Elapsed time double for 0.120000: 1573 milliseconds
Elapsed time double for 0.036000: 1573 milliseconds
Elapsed time double for 0.012000: 1572 milliseconds
Elapsed time float 1.200000: 1528 milliseconds
Elapsed time float 0.360000: 1528 milliseconds
Elapsed time float 0.120000: 1526 milliseconds
Elapsed time float 0.036000: 1609 milliseconds
Elapsed time float 0.012000: 3622 milliseconds
но я не читал код, иначе, может быть, изменил бы свое мнение.
Достаточно тесты посмотреть. :-]

Filan

Процессор за 10к р. i7 и 0-500р AMD X64 3800 показываю разницу всего в 50%.
Угу, а ты посчитай, что в i7 4 полноценных ядра + ещё гипертрединг (до 40% на этом тесте а у атлона всего 2.
Вот и считай: 1.5*2*1.4=4.2 раза

Filan

Все Core i7 920 с 24Gb памяти, Ubuntu 10.10 64bit
gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Q6600 16Gb остальное тоже самое, что и i7.
E7200 - 4Gb. Результаты с различными gcc ранее указывал.
Xeon X3430 - 8Gb.

SmoKing

а чо до сих пор gcc не умеет параллелить автоматом? Или там код не распараллеиваемый?

Filan

а чо до сих пор gcc не умеет параллелить автоматом? Или там код не распараллеиваемый?
А кто умеет такое распараллеивать?
В таком случае он должен ещё и fork/новый тред делать для каждой ветви. А количество форков динамически при запуске определять в зависимости от количество процессоров/ядер?
Нет - пока ещё "универсальный решатель с речевым вводом" не довели до такого уровня.

mersy

core i7 860 @2.80GHz, 8Gb, win7 64bit
cl /Ox /fp:fast
Elapsed time double for 1.200000: 795 milliseconds
Elapsed time double for 0.360000: 790 milliseconds
Elapsed time double for 0.120000: 788 milliseconds
Elapsed time double for 0.036000: 794 milliseconds
Elapsed time double for 0.012000: 791 milliseconds
Elapsed time float 1.200000: 627 milliseconds
Elapsed time float 0.360000: 637 milliseconds
Elapsed time float 0.120000: 625 milliseconds
Elapsed time float 0.036000: 719 milliseconds
Elapsed time float 0.012000: 1783 milliseconds

SmoKing

Ну я думал вот эту http://ru.wikipedia.org/wiki/OpenMP хератень встроили уже в стандартные компиляторы с возможностью автоматического вписания где надо #pragma omp parallel shared
Я OpenMP пользовался года 2 года назад когда диплом писал и тогда этой технологиии уже было 10 лет.
Честно говоря с теорией копиляторов знаком только по университетскому курсу, писал только компилятор для простейшего языка на 2 курсе.
Но не понимаю в чем объективная сложность распозновать участки кода годные к распаралеливанию автоматически.

Filan

#pragma omp parallel shared
Ты видел эти строчки в коде автора?
Я нет. :-]
Далее - эти директивы обрабатываются отдельно (до компилятора) специальным транслятором, который из них как раз и делает fork (и тд а так же добавляет проверку на количество процов. Я год отходил на спецсем на СП по парралельным вычислениям - там курили собственную реализацию MPI. Так вот оно без дополнительного транслятора ну никак не работает, а инфа для него берётся из правильно составленных комментариев в коде.
Если говорить глобально об оптимизации - ты не слышал о проблемах с автоматической слишком умной оптимизацией компиляторов? А я недавно столкнулся с таким - прога непонятно почему стала вылетать в каких-то примитивных случаях после пересборки её более новым GCC. Начали разбираться - -O2 кажись нормально, а -O3 вылетает (или -O1/2 - точно не помню). Вот так вот. А ты хочешь расспараллеливание поставить на поток.
UPD: транслятор для фортрана берёт директивы из комментариев, а для C из #define кажись.

Viktory-s

а чо до сих пор gcc не умеет параллелить автоматом? Или там код не распараллеиваемый?
Я пробовал эти опции для gcc (4.6.0) - не помогло.

Viktory-s

А кто умеет такое распараллеивать?
Такое нет, но вот для си появился хороший автоматический распараллеливальщик :
PLUTO - An automatic loop nest parallelizer for multicores
http://pluto-compiler.sourceforge.net/
Генерит код OpenMP и CUDA (beta)

BondarAndrey

Я OpenMP пользовался года 2 года назад когда диплом писал и тогда этой технологиии уже было 10 лет.
Много плюсов за OpenMP. Понять идею хватает одного вечера, а профиту — вагон.
ЗЫ Интересно, что AMD-шные процы по-прежнему шустры в математике.

SmoKing

PLUTO - An automatic loop nest parallelizer for multicores
--------------------------------------------------------
Ну вот, а то не бывает все сложно и т.д, а люди взяли и написали нормальный продукт.
Много плюсов за OpenMP. Понять идею хватает одного вечер.
-------------------------------------
Да уж в разы проще чем MPI

Serab

Да уж в разы проще чем MPI
О, зайдите-ка в мой тред и объясните поведение! :)

Serab

А кто умеет такое распараллеивать?
В таком случае он должен ещё и fork/новый тред делать для каждой ветви. А количество форков динамически при запуске определять в зависимости от количество процессоров/ядер?.
что-то я не понял, неужели это такая большая проблема? icc уже давно умеет автоматически параллелить циклы (именно параллелить, а не векторизовать и др.) Это, конечно, только циклы, но в цитате только технические аргументы какие-то, должно быть из-за них и циклы проблемно распараллеливать.
Я год отходил на спецсем на СП по парралельным вычислениям - там курили собственную реализацию MPI. Так вот оно без дополнительного транслятора ну никак не работает, а инфа для него берётся из правильно составленных комментариев в коде.
Неясно, причем тут MPI.

geja_03

Далее - эти директивы обрабатываются отдельно (до компилятора) специальным транслятором, который из них как раз и делает fork (и тд а так же добавляет проверку на количество процов. Я год отходил на спецсем на СП по парралельным вычислениям - там курили собственную реализацию MPI. Так вот оно без дополнительного транслятора ну никак не работает, а инфа для него берётся из правильно составленных комментариев в коде.
Эти директивы не могут обрабатываться отдельно от компилятора, поскольку влияют непосредственно на создаваемый код. Конечно, у них есть свой обработчик, который в промежуточное представление навставляет директив, которые потом словерятся в вызовы в библиотеку omp. Только он также есть часть компилятора. ;)

geja_03

что-то я не понял, неужели это такая большая проблема? icc уже давно умеет автоматически параллелить циклы (именно параллелить, а не векторизовать и др.) Это, конечно, только циклы, но в цитате только технические аргументы какие-то, должно быть из-за них и циклы проблемно распараллеливать.
Это не проблема вообще. Тот же openMP это все замечательно делает, да и интеловский распараллеливатель тоже на openMP построен. Попробую наш распараллеливатель натравить на код, не ради научного интереса, а так - позырить

geja_03

Линейная версия
gcc -O3 -ffast-math

./from_
Elapsed time double for 1.200000: 803 milliseconds
Elapsed time double for 0.360000: 787 milliseconds
Elapsed time double for 0.120000: 784 milliseconds
Elapsed time double for 0.036000: 785 milliseconds
Elapsed time double for 0.012000: 781 milliseconds
Elapsed time float 1.200000: 760 milliseconds
Elapsed time float 0.360000: 769 milliseconds
Elapsed time float 0.120000: 767 milliseconds
Elapsed time float 0.036000: 768 milliseconds
Elapsed time float 0.012000: 701 milliseconds

Параллельная версия
UPD: флотовый цикл нераспараллелился из-за expf, почему-то посчитали эту функцию небезопасной =)
utlcc -O3 -ffast-math

LD_LIBRARY_PATH=~/utlcc/lib64/:$LD_LIBRARY_PATH ./from__par
Elapsed time double for 1.200000: 238 milliseconds
Elapsed time double for 0.360000: 238 milliseconds
Elapsed time double for 0.120000: 238 milliseconds
Elapsed time double for 0.036000: 238 milliseconds
Elapsed time double for 0.012000: 238 milliseconds
Elapsed time float 1.200000: 848 milliseconds
Elapsed time float 0.360000: 848 milliseconds
Elapsed time float 0.120000: 848 milliseconds
Elapsed time float 0.036000: 855 milliseconds
Elapsed time float 0.012000: 756 milliseconds

4-x ядерный Xeon, CPUInfo:

processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 30
model name : Intel(R) Xeon(R) CPU X3430 @ 2.40GHz
stepping : 5
cpu MHz : 1197.000
cache size : 8192 KB
physical id : 0
siblings : 4
core id : 3
cpu cores : 4
apicid : 6
initial apicid : 6
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm c
onstant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni
dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt
lahf_lm ida tpr_shadow vnmi flexpriority ept vpid
bogomips : 4799.26
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

Могу на 24-х ядерной машинке померять

okis

sandy bridge 2630qm, g++ (-O3 -ffast-math -mfpmath=sse -msse3):
Elapsed time double for 1.200000: 1103 milliseconds
Elapsed time double for 0.360000: 1171 milliseconds
Elapsed time double for 0.120000: 1158 milliseconds
Elapsed time double for 0.036000: 1157 milliseconds
Elapsed time double for 0.012000: 1150 milliseconds
Elapsed time float 1.200000: 7070 milliseconds
Elapsed time float 0.360000: 6922 milliseconds
Elapsed time float 0.120000: 6906 milliseconds
Elapsed time float 0.036000: 7098 milliseconds
Elapsed time float 0.012000: 2573 milliseconds
то же на двух ядрах ВМ virtualbox в win7 (2gb):
Elapsed time double for 1.200000: 831 milliseconds
Elapsed time double for 0.360000: 798 milliseconds
Elapsed time double for 0.120000: 837 milliseconds
Elapsed time double for 0.036000: 823 milliseconds
Elapsed time double for 0.012000: 851 milliseconds
Elapsed time float 1.200000: 771 milliseconds
Elapsed time float 0.360000: 848 milliseconds
Elapsed time float 0.120000: 759 milliseconds
Elapsed time float 0.036000: 860 milliseconds
Elapsed time float 0.012000: 1095 milliseconds

SmoKing

UPD: флотовый цикл нераспараллелился из-за expf, почему-то посчитали эту функцию небезопасной =)
------------------------------------------------------------------------
Ну вот наконец то флокал родил дельный совет вместо глумеления над ТС
ТС, копай в сторону распараленивая своего кода, как показал там все хорошо, и просто запуском паралельного года на том же камне что есть у тебя можно добиться улучшения скорости в несколько раз.

Filan

Ну вот, а то не бывает все сложно и т.д, а люди взяли и написали нормальный продукт.
Не надо передёргивать. Я сказал, что для распараллеливания нужно исходный код корячить ооочень сильно, чем обычные компиляторы не занимаются.
А вот этот продук ну никак нельзя назвать обычным компиляторос. Когда его включат в gcc или clang, тогда можно будет сказать, что компилятор сам распараллеливает. А пока нужна сторонняя тулза для этого. И замечу, что не факт, что всё пройдёт гладко и полученный код выдаст тот же результат, что и линейная версия. Отчасти поэтому такого ещё нет в компиляторах общего назначения - с багами не разргебёшься.

okis

db:~$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13.0
stepping : 3
cpu MHz : 2673.198
cache size : 4096 KB
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm up rep_good l pni cx16 popcnt hypervisor lahf_lm
bogomips : 5346.39
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
Elapsed time double for 1.200000: 1236 milliseconds
Elapsed time double for 0.360000: 1304 milliseconds
Elapsed time double for 0.120000: 1222 milliseconds
Elapsed time double for 0.036000: 1219 milliseconds
Elapsed time double for 0.012000: 1221 milliseconds
Elapsed time float 1.200000: 6157 milliseconds
Elapsed time float 0.360000: 6159 milliseconds
Elapsed time float 0.120000: 6181 milliseconds
Elapsed time float 0.036000: 6178 milliseconds
Elapsed time float 0.012000: 2409 milliseconds
vm:~$ ./a.out
Elapsed time double for 1.200000: 5992 milliseconds
Elapsed time double for 0.360000: 5423 milliseconds
Elapsed time double for 0.120000: 5846 milliseconds
Elapsed time double for 0.036000: 5338 milliseconds
Elapsed time double for 0.012000: 5647 milliseconds
Elapsed time float 1.200000: 18533 milliseconds
Elapsed time float 0.360000: 20602 milliseconds
Elapsed time float 0.120000: 20152 milliseconds
Elapsed time float 0.036000: 21079 milliseconds
Elapsed time float 0.012000: 7480 milliseconds
vm:~$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 16
model : 4
model name : Quad-Core AMD Opteron(tm) Processor 2382
это тоже vps, не знаю, почему так медленно

Filan

что-то я не понял, неужели это такая большая проблема? icc уже давно умеет автоматически параллелить циклы (именно параллелить, а не векторизовать и др.) Это, конечно, только циклы, но в цитате только технические аргументы какие-то, должно быть из-за них и циклы проблемно распараллеливать.
Это типа "я плохо разбираюсь в теме, поэтому наверно ты не прав"? :-D
Как ты себе представляешь параллельную работу в рамках одного приложения? Это или создаётся новый процесс (fork) или тред (pthread_create) - кто за автора кода должен такое вызывать и ещё обрабатывать все исключительные ситуации?
Неясно, причем тут MPI.

Подумай ещё раз - может догадаешься, что это пример того, как пишутся расчёты для многопроцессорных систем.

Filan

Эти директивы не могут обрабатываться отдельно от компилятора, поскольку влияют непосредственно на создаваемый код. Конечно, у них есть свой обработчик, который в промежуточное представление навставляет директив, которые потом словерятся в вызовы в библиотеку omp. Только он также есть часть компилятора. ;)
Эти директивы, о которых я говорил, помещаются в комментариях (и кажись в #define). И обычный компилятор их попросту игнорирует. Но после обработки такого кода дополнительной прослойкой транслятором, который как раз и добавляет все необходимые вызовы в библиотеку MPI, получается распараллеленный код.
Может за последние лет 10 они уже что-то существенно изменили - я на этот спецсем ходил в 2000ом году, а тогда это было именно так.

geja_03

Эти директивы, о которых я говорил, помещаются в комментариях (и кажись в #define). И обычный компилятор их попросту игнорирует. Но после обработки такого кода дополнительной прослойкой транслятором, который как раз и добавляет все необходимые вызовы в библиотеку MPI, получается распараллеленный код.
Может за последние лет 10 они уже что-то существенно изменили - я на этот спецсем ходил в 2000ом году, а тогда это было именно так.
openmp.org - загляни. ;)
Первая версия стандарта в 1997 году вышла. Почти все современные компиляторы поддерживают OpenMP, так что не вижу в чем вообще трудности. Опять же есть несколько компиляторов вообще автораспараллеливанием занимается.

Filan

Автору я это кидал приватом, но всвязи с таким интересом к очевидностям запощу и сюда.
Я вообще думал, что все понимают, что автор в данный момент всеголишь тестирует скорость однопоточного вычисления и потом может легко экстраполировать результат на N ядер. Видимо только мне это очевидно... Странно...
Мне была интересна эффективность гипертрединга на нахелемах (Core i7 920) - только поэтому я этим заморочился. В честном 4х ядернике Q6600 каждый из 4 процессов посчитал свою часть ровно за столько же, за сколько и 1 единственный процесс. А что же будет с нечестным 8ми ядерником?
Вот скрипт:
 #!/bin/sh

N=$1
NAME=$2
if [ "x${NAME}" = "x" ]; then
NAME=test
fi
if [ "x${N}" != "x" ]; then
while [ "x${N}" != "x0" ]; do
nice --20 ./test > ${NAME}.${N}.log &
echo ${N}
N=$${N} - 1
done
fi

Название бинарника "test".
Я сравнивал 4 и 8 процессов:
Каждый из 8и:
Elapsed time double for 1.200000: 1250 milliseconds
Elapsed time double for 0.360000: 1249 milliseconds
Elapsed time double for 0.120000: 1249 milliseconds
Elapsed time double for 0.036000: 1251 milliseconds
Elapsed time double for 0.012000: 1250 milliseconds
Elapsed time float 1.200000: 5450 milliseconds
Elapsed time float 0.360000: 5443 milliseconds
Elapsed time float 0.120000: 5441 milliseconds
Elapsed time float 0.036000: 5435 milliseconds
Elapsed time float 0.012000: 2297 milliseconds
Каждый из 4:
Elapsed time double for 1.200000: 953 milliseconds
Elapsed time double for 0.360000: 907 milliseconds
Elapsed time double for 0.120000: 907 milliseconds
Elapsed time double for 0.036000: 908 milliseconds
Elapsed time double for 0.012000: 908 milliseconds
Elapsed time float 1.200000: 4725 milliseconds
Elapsed time float 0.360000: 4724 milliseconds
Elapsed time float 0.120000: 4725 milliseconds
Elapsed time float 0.036000: 4719 milliseconds
Elapsed time float 0.012000: 1865 milliseconds
С гипертредингом оно посчитало 8 за 1250ms, а без 900ms*2=1800ms.
Итого: 1800/1250=1.44. В 1.44 раза быстрее!

geja_03

То же самое на 24 ядрах
Параллельно

Elapsed time double for 1.200000: 163 milliseconds
Elapsed time double for 0.360000: 159 milliseconds
Elapsed time double for 0.120000: 181 milliseconds
Elapsed time double for 0.036000: 287 milliseconds
Elapsed time double for 0.012000: 190 milliseconds
Elapsed time float 1.200000: 769 milliseconds
Elapsed time float 0.360000: 768 milliseconds
Elapsed time float 0.120000: 768 milliseconds
Elapsed time float 0.036000: 774 milliseconds
Elapsed time float 0.012000: 701 milliseconds

Не параллельно

Elapsed time double for 1.200000: 715 milliseconds
Elapsed time double for 0.360000: 705 milliseconds
Elapsed time double for 0.120000: 719 milliseconds
Elapsed time double for 0.036000: 705 milliseconds
Elapsed time double for 0.012000: 705 milliseconds
Elapsed time float 1.200000: 690 milliseconds
Elapsed time float 0.360000: 690 milliseconds
Elapsed time float 0.120000: 690 milliseconds
Elapsed time float 0.036000: 695 milliseconds
Elapsed time float 0.012000: 649 milliseconds

CPU:

processor : 23
vendor_id : GenuineIntel
cpu family : 6
model : 44
model name : Intel(R) Xeon(R) CPU X5650 @ 2.67GHz
stepping : 2
cpu MHz : 1596.000
cache size : 12288 KB
physical id : 1
siblings : 12
core id : 10
cpu cores : 6
apicid : 53
initial apicid : 53
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rd
scp lm constant_tsc arch_perfmon pebs bts rep_good l xtopology nonstop_tsc a
erfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse
_1 sse4_2 popcnt lahf_lm ida arat dts tpr_shadow vnmi flexpriority ept vpid
bogomips : 5320.63
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:

Filan

так что не вижу в чем вообще трудности
Покажи опции GCC, которые надо указать, чтобы код был распараллелен, но ты не должен сам модифицировать исходники автора.

Filan

То же самое на 24 ядрах
 http://static.diary.ru/userdir/2/2/8/2/2282305/66343388.jpg
Это не 24 ядра - это 12 ядер с гипертредингом.

geja_03

В gcc что-то пыжились-пыжились, но ничего серьезного пока не родили.
Наша надстройка над gcc без опций распараллелит
Интел icc -parallel
Есть еще несколько компиляторов в большей или меньшей степени способных на это PathScale, PLUTO и т.д.

Makc500

А как ты ее параллелил?

geja_03

http://static.diary.ru/userdir/2/2/8/2/2282305/66343388.jpg
Это не 24 ядра - это 12 ядер с гипертредингом.
Ок, на 24 потоках - так устроит?

geja_03

А как ты ее параллелил?
http://optimitech.com/ru_004.htm
В общем проект сначала заглох, потом пополз в другом направлении, но бетка более-менее рабочая есть )

Filan

PLUTO
Не компилятор.
Pluto transforms C programs from source to source for coarse-grained parallelism and data locality simultaneously.

TRYING A NEW CODE
- Use '#pragma scop' and '#pragma endscop' around the section of code
you want to parallelize/optimize.
- Then, just run

./polycc <C source file> --parallel --tile
The transformation is also printed out, and test.par.c will have the
parallelized code.

NataNata

еще раз скорректировал

Filan

PathScale
Что-то платное, в названии есть слово compiller, с документацие о том, как его установить на Ubuntu 7 и 8 - оно точно ещё живое?

geja_03

Не знаю, я его н лет назад смотрел...

Serab

Как ты себе представляешь параллельную работу в рамках одного приложения? Это или создаётся новый процесс (fork) или тред (pthread_create) - кто за автора кода должен такое вызывать и ещё обрабатывать все исключительные ситуации?
ну посмотри уже icc -parellel, я о нем. В чем тут я не разбираюсь-то? Ты вот путаешь MPI с чем-то, это совершенно другая вещь по отношению к OpenMP и на одном узле им редко пользуются (если вообще не только для тестирования или от отсутствия другой версии параллельной программы).

geja_03

В ответ на:
PLUTO
Не компилятор.
 
В ответ на:
Pluto transforms C programs from source to source for coarse-grained parallelism and data locality simultaneously.
 
В ответ на:
TRYING A NEW CODE
- Use '#pragma scop' and '#pragma endscop' around the section of code
  you want to parallelize/optimize.
- Then, just run
    
    ./polycc <C source file> --parallel --tile
  The transformation is also printed out, and test.par.c will have the
  parallelized code.
Серьезные ребята. =) Ну а что - в полуавтоматическом режиме параллелит.

Filan

В gcc что-то пыжились-пыжились, но ничего серьезного пока не родили.
Я тебе об этом с самого начала говорил.
 
Наша надстройка над gcc без опций распараллелит

Мля! Так это и есть транслятор! Оно генерит код (такой же C/CPP код, только с нужными вызовами в библиотеку, а может и само вызывает fork/pthread_create) и скармливает этот код компилятору общего назначения. О чём я говорю с самого начала.
 
Интел icc -parallel

Я бы лучше руками распареллелил или хотя бы OpenMP полистал, но не стал бы распараллеливание матрасчётов доверять компилятору.
Это -parallel сделано скорее для ПО общего назначения - для конечного хомячка даст прирост в несколько процентов, а то и десятков процентов в каком-нибудь офисном приложении или браузере. Но это не панацея и, IMHO, для целей автроа явно не подходит.

Serab

хотя, ладно, на NUMA пользуются, наверное, все же :)

geja_03

Мля! Так это и есть транслятор! Оно генерит код (такой же C/CPP код, только с нужными вызовами в библиотеку MPI, а может и само вызывает fork/pthread_create) и скармливает этот код компилятору общего назначения. О чём я говорю с самого начала.
Вообще это компилятор промежуточных представлений, просто, помимо всего прочего, генерит вызовы в библиотеку openMP. Считай это один из проходов компилятора по лицензионным соображениям вынесенный в отдельное приложение. В интеле автораспараллеливание тоже фаза компилятора.

geja_03

Я бы лучше руками распареллелил или хотя бы OpenMP полистал, но не стал бы распараллеливание матрасчётов доверять компилятору.
Это -parallel сделано скорее для ПО общего назначения - для конечного хомячка даст прирост в несколько процентов, а то и десятков процентов в каком-нибудь офисном приложении или браузере. Но это не панацея и, IMHO, для целей автроа явно не подходит.
Значит делать ассемблер компилятору доверить можно, а параллелизм сделать нет? :cool: Этот -параллел как раз для рассчетов предназначен - в обычном софте он и не сработает нигде по большому счету. Топикстартеру нужно взботнуть openMP и его программа станет параллельной при помощи 2х строчек - это точно.

Filan

Значит делать ассемблер компилятору доверить можно
Вообще-то это основная его задача, "если чё". :-P

okis

-K53SJ:~$ /opt/intel/bin/icc -parallel -static bench.cpp
-K53SJ:~$ ./a.out
Elapsed time double for 1.200000: 0 milliseconds
Elapsed time double for 0.360000: 0 milliseconds
Elapsed time double for 0.120000: 0 milliseconds
Elapsed time double for 0.036000: 0 milliseconds
Elapsed time double for 0.012000: 0 milliseconds
Elapsed time float 1.200000: 0 milliseconds
Elapsed time float 0.360000: 0 milliseconds
Elapsed time float 0.120000: 0 milliseconds
Elapsed time float 0.036000: 0 milliseconds
Elapsed time float 0.012000: 0 milliseconds
без parallel та же фигня :)

geja_03

Ну результат же нигде не используется, зачем что-то там вычислять? Интел, сцуко, умный

okis

с небольшим фиксом на 2630qm:
-K53SJ:~$ /opt/intel/bin/icc -parallel -static bench.cpp
-K53SJ:~$ ./a.out
0.499819Elapsed time double for 1.200000: 193 milliseconds
0.499504Elapsed time double for 0.360000: 215 milliseconds
0.503046Elapsed time double for 0.120000: 180 milliseconds
0.532918Elapsed time double for 0.036000: 169 milliseconds
0.455971Elapsed time double for 0.012000: 188 milliseconds
0.499809Elapsed time float 1.200000: 147 milliseconds
0.499464Elapsed time float 0.360000: 162 milliseconds
0.503050Elapsed time float 0.120000: 222 milliseconds
0.532919Elapsed time float 0.036000: 167 milliseconds
0.455971Elapsed time float 0.012000: 233 milliseconds
-K53SJ:~$ /opt/intel/bin/icc -parallel -static -O3 bench.cpp
-K53SJ:~$ ./a.out
0.499819Elapsed time double for 1.200000: 169 milliseconds
0.499504Elapsed time double for 0.360000: 212 milliseconds
0.503046Elapsed time double for 0.120000: 189 milliseconds
0.532918Elapsed time double for 0.036000: 187 milliseconds
0.455971Elapsed time double for 0.012000: 170 milliseconds
0.499809Elapsed time float 1.200000: 162 milliseconds
0.499464Elapsed time float 0.360000: 184 milliseconds
0.503050Elapsed time float 0.120000: 152 milliseconds
0.532919Elapsed time float 0.036000: 170 milliseconds
0.455971Elapsed time float 0.012000: 188 milliseconds
-K53SJ:~$ /opt/intel/bin/icc -parallel -static -fast bench.cpp
ipo: remark performing single-file optimizations
ipo: remark generating object file /tmp/ipo_iccLbACFp.o
-K53SJ:~$ ./a.out
0.499819Elapsed time double for 1.200000: 133 milliseconds
0.499504Elapsed time double for 0.360000: 159 milliseconds
0.503046Elapsed time double for 0.120000: 149 milliseconds
0.532918Elapsed time double for 0.036000: 145 milliseconds
0.455971Elapsed time double for 0.012000: 166 milliseconds
0.499809Elapsed time float 1.200000: 134 milliseconds
0.499464Elapsed time float 0.360000: 143 milliseconds
0.503049Elapsed time float 0.120000: 172 milliseconds
0.532919Elapsed time float 0.036000: 147 milliseconds
0.455971Elapsed time float 0.012000: 158 milliseconds

NataNata

поправил табличку
Все интереснее и интереснее

tapo4ek

есть двухпроцессорный power6 c gcc, пока результат такой
 
Elapsed time double for 1.200000: 1901 milliseconds
Elapsed time double for 0.360000: 1898 milliseconds
Elapsed time double for 0.120000: 1900 milliseconds
Elapsed time double for 0.036000: 1900 milliseconds
Elapsed time double for 0.012000: 1899 milliseconds
Elapsed time float 1.200000: 2339 milliseconds
Elapsed time float 0.360000: 2335 milliseconds
Elapsed time float 0.120000: 2337 milliseconds
Elapsed time float 0.036000: 2335 milliseconds
Elapsed time float 0.012000: 2335 milliseconds

NataNata

добавил

Andbar

Phenom II X4 955 @ 3.61GHz
Win7 64bit
 
Elapsed time double for 1.200000: 748 milliseconds
Elapsed time double for 0.360000: 753 milliseconds
Elapsed time double for 0.120000: 761 milliseconds
Elapsed time double for 0.036000: 760 milliseconds
Elapsed time double for 0.012000: 763 milliseconds
Elapsed time float 1.200000: 667 milliseconds
Elapsed time float 0.360000: 666 milliseconds
Elapsed time float 0.120000: 669 milliseconds
Elapsed time float 0.036000: 671 milliseconds
Elapsed time float 0.012000: 838 milliseconds

Core Duo T2400 @ 1.83GHz
Win7 32bit
 
Elapsed time double for 1.200000: 1804 milliseconds
Elapsed time double for 0.360000: 1890 milliseconds
Elapsed time double for 0.120000: 1903 milliseconds
Elapsed time double for 0.036000: 1956 milliseconds
Elapsed time double for 0.012000: 1921 milliseconds
Elapsed time float 1.200000: 1667 milliseconds
Elapsed time float 0.360000: 1661 milliseconds
Elapsed time float 0.120000: 1697 milliseconds
Elapsed time float 0.036000: 1782 milliseconds
Elapsed time float 0.012000: 4252 milliseconds

Бинарник один и тот же, на 64хбитном времена больше.
upd.
cl /Ox /arch:SSE2 /fp:fast
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
у AlexSA (см. пост ниже) бинарник тот-же

danaql

2х Xeon E5620 2.4ГГц 24Гб Win 2k8R2
Elapsed time double for 1.200000: 889 milliseconds
Elapsed time double for 0.360000: 868 milliseconds
Elapsed time double for 0.120000: 907 milliseconds
Elapsed time double for 0.036000: 816 milliseconds
Elapsed time double for 0.012000: 799 milliseconds
Elapsed time float 1.200000: 731 milliseconds
Elapsed time float 0.360000: 752 milliseconds
Elapsed time float 0.120000: 759 milliseconds
Elapsed time float 0.036000: 853 milliseconds
Elapsed time float 0.012000: 2681 milliseconds
Core i7 930 3ГГц 12Гб Win 2k3
Elapsed time double for 1.200000: 641 milliseconds
Elapsed time double for 0.360000: 656 milliseconds
Elapsed time double for 0.120000: 641 milliseconds
Elapsed time double for 0.036000: 672 milliseconds
Elapsed time double for 0.012000: 656 milliseconds
Elapsed time float 1.200000: 641 milliseconds
Elapsed time float 0.360000: 656 milliseconds
Elapsed time float 0.120000: 672 milliseconds
Elapsed time float 0.036000: 734 milliseconds
Elapsed time float 0.012000: 2547 milliseconds
Core i5 750 2.6ГГц 8Гб Win 2k8R2
Elapsed time double for 1.200000: 1658 milliseconds
Elapsed time double for 0.360000: 1595 milliseconds
Elapsed time double for 0.120000: 1496 milliseconds
Elapsed time double for 0.036000: 1616 milliseconds
Elapsed time double for 0.012000: 1505 milliseconds
Elapsed time float 1.200000: 1450 milliseconds
Elapsed time float 0.360000: 1544 milliseconds
Elapsed time float 0.120000: 1540 milliseconds
Elapsed time float 0.036000: 1706 milliseconds
Elapsed time float 0.012000: 6106 milliseconds
Core 2 Quad Q9450 2.6ГГц 8Гб Win 2k8R2
Elapsed time double for 1.200000: 857 milliseconds
Elapsed time double for 0.360000: 872 milliseconds
Elapsed time double for 0.120000: 813 milliseconds
Elapsed time double for 0.036000: 807 milliseconds
Elapsed time double for 0.012000: 807 milliseconds
Elapsed time float 1.200000: 787 milliseconds
Elapsed time float 0.360000: 793 milliseconds
Elapsed time float 0.120000: 791 milliseconds
Elapsed time float 0.036000: 898 milliseconds
Elapsed time float 0.012000: 3108 milliseconds

da_hedgehog

Если алгоритм можно распараллелить, то может CUDA попробовать?

Travelnad

2x Xeon E5450 3.00GHz 8Gb Linux 64-bit
непараллельно
icc -ipo -no-prec-div -xHost -O3
Elapsed time double for 1.200000: 820 milliseconds
Elapsed time double for 0.360000: 815 milliseconds
Elapsed time double for 0.120000: 814 milliseconds
Elapsed time double for 0.036000: 836 milliseconds
Elapsed time double for 0.012000: 818 milliseconds
Elapsed time float 1.200000: 676 milliseconds
Elapsed time float 0.360000: 676 milliseconds
Elapsed time float 0.120000: 673 milliseconds
Elapsed time float 0.036000: 682 milliseconds
Elapsed time float 0.012000: 863 milliseconds

параллельно
icc -openmp -parallel -ipo -no-prec-div -xHost -O3
Elapsed time double for 1.200000: 177 milliseconds
Elapsed time double for 0.360000: 177 milliseconds
Elapsed time double for 0.120000: 225 milliseconds
Elapsed time double for 0.036000: 185 milliseconds
Elapsed time double for 0.012000: 212 milliseconds
Elapsed time float 1.200000: 99 milliseconds
Elapsed time float 0.360000: 99 milliseconds
Elapsed time float 0.120000: 99 milliseconds
Elapsed time float 0.036000: 99 milliseconds
Elapsed time float 0.012000: 132 milliseconds

NataNata

Добавил в таблицу

NataNata

задача ставится так, что необходимо понять производительность для CPU. Про cuda речи в постановке задачи не идет.

sergako

Tegra 250 (2 x 1.0 GHz) Linux
g++ -O3 -ffast-math -mcpu=cortex-a9 -mfpu=vfpv3-d16 -march=armv7-a -fno-gcse -fprefetch-loop-arrays -mtune=cortex-a9
Elapsed time double for 1.200000: 11828 milliseconds
Elapsed time double for 0.360000: 11384 milliseconds
Elapsed time double for 0.120000: 11364 milliseconds
Elapsed time double for 0.036000: 11357 milliseconds
Elapsed time double for 0.012000: 11407 milliseconds
Elapsed time float 1.200000: 8609 milliseconds
Elapsed time float 0.360000: 8613 milliseconds
Elapsed time float 0.120000: 8760 milliseconds
Elapsed time float 0.036000: 8677 milliseconds
Elapsed time float 0.012000: 7178 milliseconds

Pentium SU2700 (1.3 GHz) Vista 32
cl /Ox /arch:SSE2 /fp:fast

Elapsed time double for 1.200000: 1660 milliseconds
Elapsed time double for 0.360000: 1647 milliseconds
Elapsed time double for 0.120000: 1639 milliseconds
Elapsed time double for 0.036000: 1675 milliseconds
Elapsed time double for 0.012000: 1647 milliseconds
Elapsed time float 1.200000: 1608 milliseconds
Elapsed time float 0.360000: 1664 milliseconds
Elapsed time float 0.120000: 1611 milliseconds
Elapsed time float 0.036000: 1849 milliseconds
Elapsed time float 0.012000: 5925 milliseconds

Andbar

Phenom II X4 955 @ 3.61GHz
Win7 64bit
Запустил тоже самое под VMWare 7.1.4 (у гостевой системы 2 ядра, ОС - WinXP sp3) и под VirtualPC(стандартный windows xp mode получил следующие результаты:
vmware:
Elapsed time double for 1.200000: 719 milliseconds
Elapsed time double for 0.360000: 703 milliseconds
Elapsed time double for 0.120000: 703 milliseconds
Elapsed time double for 0.036000: 703 milliseconds
Elapsed time double for 0.012000: 719 milliseconds
Elapsed time float 1.200000: 688 milliseconds
Elapsed time float 0.360000: 688 milliseconds
Elapsed time float 0.120000: 688 milliseconds
Elapsed time float 0.036000: 703 milliseconds
Elapsed time float 0.012000: 891 milliseconds

VirtualPC
Elapsed time double for 1.200000: 711 milliseconds
Elapsed time double for 0.360000: 721 milliseconds
Elapsed time double for 0.120000: 721 milliseconds
Elapsed time double for 0.036000: 701 milliseconds
Elapsed time double for 0.012000: 721 milliseconds
Elapsed time float 1.200000: 681 milliseconds
Elapsed time float 0.360000: 701 milliseconds
Elapsed time float 0.120000: 671 milliseconds
Elapsed time float 0.036000: 681 milliseconds
Elapsed time float 0.012000: 891 milliseconds

Похоже у виртуальных машин неадекватно работает счётчик времени, впрочем нормально это не проверить, разница в скорости очень маленькая

NataNata

подкорректировал

geja_03

Похоже у виртуальных машин неадекватно работает счётчик времени
Вполне адекватно задаче) Он смещается на то количество квантов времени, которое недосталось виртуалке, в результате чего время в виртуальной машине течет непрерывно :D

agaaaa

Phenom II 925, Windows 7, Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
Elapsed time double for 1.200000: 849 milliseconds
Elapsed time double for 0.360000: 848 milliseconds
Elapsed time double for 0.120000: 850 milliseconds
Elapsed time double for 0.036000: 848 milliseconds
Elapsed time double for 0.012000: 849 milliseconds
Elapsed time float 1.200000: 801 milliseconds
Elapsed time float 0.360000: 800 milliseconds
Elapsed time float 0.120000: 800 milliseconds
Elapsed time float 0.036000: 831 milliseconds
Elapsed time float 0.012000: 1100 milliseconds

Phenom II 925, Windows 7, Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64
Elapsed time double for 1.200000: 915 milliseconds
Elapsed time double for 0.360000: 916 milliseconds
Elapsed time double for 0.120000: 915 milliseconds
Elapsed time double for 0.036000: 915 milliseconds
Elapsed time double for 0.012000: 917 milliseconds
Elapsed time float 1.200000: 760 milliseconds
Elapsed time float 0.360000: 759 milliseconds
Elapsed time float 0.120000: 759 milliseconds
Elapsed time float 0.036000: 799 milliseconds
Elapsed time float 0.012000: 2366 milliseconds

Filan

Core i5 2500K номинал без всякой настройки (ещё не дошли руки 8Gb оперативки.
Ubuntu 11.04 86x64, gcc 4.5.2
g++ -O3 -ffast-math -mfpmath=sse -msse2 -march=core2 -mtune=core2
$ ./test-core2-gcc45
Elapsed time double for 1.200000: 827 milliseconds
Elapsed time double for 0.360000: 826 milliseconds
Elapsed time double for 0.120000: 826 milliseconds
Elapsed time double for 0.036000: 826 milliseconds
Elapsed time double for 0.012000: 826 milliseconds
Elapsed time float 1.200000: 5098 milliseconds
Elapsed time float 0.360000: 5113 milliseconds
Elapsed time float 0.120000: 5120 milliseconds
Elapsed time float 0.036000: 5160 milliseconds
Elapsed time float 0.012000: 1927 milliseconds
g++ -O3 -ffast-math -mfpmath=387 -msse2 -march=core2 -mtune=core2
$ ./test-core2-gcc45-387
Elapsed time double for 1.200000: 892 milliseconds
Elapsed time double for 0.360000: 890 milliseconds
Elapsed time double for 0.120000: 889 milliseconds
Elapsed time double for 0.036000: 890 milliseconds
Elapsed time double for 0.012000: 890 milliseconds
Elapsed time float 1.200000: 875 milliseconds
Elapsed time float 0.360000: 871 milliseconds
Elapsed time float 0.120000: 870 milliseconds
Elapsed time float 0.036000: 871 milliseconds
Elapsed time float 0.012000: 870 milliseconds
Как разгоню - повторю.
Оставить комментарий
Имя или ник:
Комментарий: