прогнать самописный бенчмарк на последнем core i7
выкладывай в общий доступ!
блин, а чего выкладывать? это ж не бенчмарк общего назначения, это 1 итерация некоторого весьма специфического алгоритма. Смысла не вижу...
сможешь получить кучу результатов на различных системах от энтузиастов
Ещё есть Q6600 @ 3.2GHz - это не так интересно, но всё же.
Скоро должна появиться парочка Core i5-2500K - думаю на 4.5GHz заработают без проблем.
Везде Ubuntu 10.10/11.04 64bit, оперативки от 8 до 24Gb.
Выкладывай сырцы - протестирую.
Очень хотелось бы потестить мини-вариант вычислений (работает пару секунд) на каких-нибудь зверских процах самых последних поколений. Если кто-нибудь может предоставить свою машину для запуска кода - буду очень признателен. Могу предоставить 1) .cpp код для компиляции на винде 2) .cpp код для компиляции под линуксом 3) бинарники для винды (80 кб, скомпилен под msvs 9.0) 4) бинарники для линукса.есть машины q8200/8gb (win7 x32); sandy bridge 2630qm/4gb (ноут, ubuntu 11.04 x64, win7 virtualbox).
Intel Atom 230, 3Gb
FreeBSD
Код для линукса (компилил, как 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
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
core 2 t5300 / 3gb, g++результаты с моего ноута (core i2 t7500, 2 gb, msvs, без ключа /fp:fast)
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
Elapsed time double for 1.200000: 1764 millisecondsрезультаты с моего ноута (core i2 t7500, 2 gb, msvs, с ключом /fp:fast)
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
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
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
$ g++ -O3 -mfpmath=sse -msse4 -ffast-math
Elapsed time double for 1.200000: 1234 millisecondsЗ.ы. почему-то g++ сильно проседает на float-ах...
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
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
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
видимо, 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
-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
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
Быстрее всего c:Как я ни пытался, но ни на redhat-е, ни на debian-е я не смог получить результата, чтобы скорость теста для float был быстрее\равен скорость для double-ов. А на freebsd, кстати, все пучком. Хотя есть подозрение, что это из-за 64-битности линуксов и 32-битности freebsd.
g++45 -O3 -mfpmath=sse -msse3 -ffast-math -mtune=core2 -march=core2 -o test45-core2 test.cpp
Хотя есть подозрение, что это из-за 64-битности линуксов и 32-битности freebsd.У меня FreeBSD на 64bit тоже есть. Так что версия не подтверждается...
У меня FreeBSD на 64bit тоже есть. Так что версия не подтверждается...ну и ладно, тем более, что в дизассемблер все равно лень лезть
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
Я правильно понял, что ты забумал апгрейдить комп и решаешь на сколько это целесообразно?
Я правильно понял, что ты забумал апгрейдить комп и решаешь на сколько это целесообразно?да
Просто говорили тут, core i7, мол, новый контроллер памяти, ляля, ну я и подумал про попробовать.
Просто говорили тут, core i7, мол, новый контроллер памяти, ляля, ну я и подумал про попробовать.Ну так и посмотри на разницу Core i7 920 и твоего Q6600 - в полтора раза точно, а ещё гипертрединг на твоих тестах + порядка 40%.
А Xeon у тебя и так "на ядре нахелем" 32нм.
Тебе надо посмотреть результаты сандиков - это Xeon E-* и Core i5/7 2x00.
Думаю будет быстрее ещё процентов на 20-30.
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
более того, синтетические тесты - одно, а запчасть от своей проги - другое
Как будет сандик под рукой (уже говорил, что в течении недели) - обязательно протестирую.
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
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
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 гига.
Core i5-2500K @3600 MhzОпа - даблы чуть лучше, чем на i7 920 @ 3.6, а флоаты чуть хуже.
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
Но это один процесс. А вот 8 на нахелеме, по всей видимости, будут побыстрее. Правда 920 особо сильнее не погонишь, а 2500K ещё +1GHz только в путь.
4.5GHz не будешь делать?
bugaga ~ $ g++ -O3 -mfpmath=sse -msse3 -ffast-math -mtune=core2 -march=core2 test.cppgcc --version
У тебя одного на линуксе, как это ни странно, даблы и флоаты близки.
Такие результаты вижу только на FreeBSD и win.
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
$ 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.
4.5GHz не будешь делать?Подумываю. Можешь кинуть ссылок на грамотные материалы по разгону "для нубов"?
Фиксируешь все напряжения на дефолте, в том числе CPU.
Далее повышаешь множитель CPU и при необходимости напряжение на CPU для достижения стабильности. Тестишь LinX на пол часика и смотришь температуру в эвересте каком-нибудь (да, пока разгон проще делать под мастдаями). Если температура в нагрузке < 80C, то смело можно повышать множитель дальше. Стабильность потерял - повышай чуток напряжение. Ну температура чтобы была в пределах 90C в нагрузке. Ну и напряжение выше 1.35V я бы не стал ставить. AFAIK, сандики раньше упираются не в температуру, а в стабильность при допустимом напряжении. Когда решил, что всё - ставь LinX на ночь.
Потом можно погнать память до 1600MHz CL8 1.65V - тестить memtest-ом.
P.S. Думаю гугл легко найдёт парочку-троечку мануалов по разгону сандиков.
gcc --versionпоправил пост, у меня 4.5.2
У тебя одного на линуксе, как это ни странно, даблы и флоаты близки.а почему так?
Такие результаты вижу только на FreeBSD и win.
интуитивно полагаю, что это НЕ связано с версией gcc.
но я не читал код, иначе, может быть, изменил бы свое мнение.
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
свел все в табличку в 1 посте
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
~~~~~~~~~~~~~~~~~~~~~~~~~~
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
Процессор за 10к р. i7 и 0-500р AMD X64 3800 показываю разницу всего в 50%.
Кто нибудь по коду понял в чем причина такой маленькой разницы?
интуитивно полагаю, что это НЕ связано с версией 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
но я не читал код, иначе, может быть, изменил бы свое мнение.Достаточно тесты посмотреть. :-]
Процессор за 10к р. i7 и 0-500р AMD X64 3800 показываю разницу всего в 50%.Угу, а ты посчитай, что в i7 4 полноценных ядра + ещё гипертрединг (до 40% на этом тесте а у атлона всего 2.
Вот и считай: 1.5*2*1.4=4.2 раза
gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Q6600 16Gb остальное тоже самое, что и i7.
E7200 - 4Gb. Результаты с различными gcc ранее указывал.
Xeon X3430 - 8Gb.
а чо до сих пор gcc не умеет параллелить автоматом? Или там код не распараллеиваемый?
а чо до сих пор gcc не умеет параллелить автоматом? Или там код не распараллеиваемый?А кто умеет такое распараллеивать?
В таком случае он должен ещё и fork/новый тред делать для каждой ветви. А количество форков динамически при запуске определять в зависимости от количество процессоров/ядер?
Нет - пока ещё "универсальный решатель с речевым вводом" не довели до такого уровня.
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
http://ru.wikipedia.org/wiki/OpenMP хератень встроили уже в стандартные компиляторы с возможностью автоматического вписания где надо #pragma omp parallel shared
Я OpenMP пользовался года 2 года назад когда диплом писал и тогда этой технологиии уже было 10 лет.
Честно говоря с теорией копиляторов знаком только по университетскому курсу, писал только компилятор для простейшего языка на 2 курсе.
Но не понимаю в чем объективная сложность распозновать участки кода годные к распаралеливанию автоматически.
Ну я думал вот эту Я OpenMP пользовался года 2 года назад когда диплом писал и тогда этой технологиии уже было 10 лет.
Честно говоря с теорией копиляторов знаком только по университетскому курсу, писал только компилятор для простейшего языка на 2 курсе.
Но не понимаю в чем объективная сложность распозновать участки кода годные к распаралеливанию автоматически.
#pragma omp parallel sharedТы видел эти строчки в коде автора?
Я нет. :-]
Далее - эти директивы обрабатываются отдельно (до компилятора) специальным транслятором, который из них как раз и делает fork (и тд а так же добавляет проверку на количество процов. Я год отходил на спецсем на СП по парралельным вычислениям - там курили собственную реализацию MPI. Так вот оно без дополнительного транслятора ну никак не работает, а инфа для него берётся из правильно составленных комментариев в коде.
Если говорить глобально об оптимизации - ты не слышал о проблемах с автоматической слишком умной оптимизацией компиляторов? А я недавно столкнулся с таким - прога непонятно почему стала вылетать в каких-то примитивных случаях после пересборки её более новым GCC. Начали разбираться - -O2 кажись нормально, а -O3 вылетает (или -O1/2 - точно не помню). Вот так вот. А ты хочешь расспараллеливание поставить на поток.
UPD: транслятор для фортрана берёт директивы из комментариев, а для C из #define кажись.
а чо до сих пор gcc не умеет параллелить автоматом? Или там код не распараллеиваемый?Я пробовал эти опции для gcc (4.6.0) - не помогло.
А кто умеет такое распараллеивать?Такое нет, но вот для си появился хороший автоматический распараллеливальщик :
PLUTO - An automatic loop nest parallelizer for multicores
http://pluto-compiler.sourceforge.net/
Генерит код OpenMP и CUDA (beta)
Я OpenMP пользовался года 2 года назад когда диплом писал и тогда этой технологиии уже было 10 лет.Много плюсов за OpenMP. Понять идею хватает одного вечера, а профиту — вагон.
ЗЫ Интересно, что AMD-шные процы по-прежнему шустры в математике.
--------------------------------------------------------
Ну вот, а то не бывает все сложно и т.д, а люди взяли и написали нормальный продукт.
Много плюсов за OpenMP. Понять идею хватает одного вечер.
-------------------------------------
Да уж в разы проще чем MPI
Да уж в разы проще чем MPIО, зайдите-ка в мой тред и объясните поведение!
А кто умеет такое распараллеивать?что-то я не понял, неужели это такая большая проблема? icc уже давно умеет автоматически параллелить циклы (именно параллелить, а не векторизовать и др.) Это, конечно, только циклы, но в цитате только технические аргументы какие-то, должно быть из-за них и циклы проблемно распараллеливать.
В таком случае он должен ещё и fork/новый тред делать для каждой ветви. А количество форков динамически при запуске определять в зависимости от количество процессоров/ядер?.
Я год отходил на спецсем на СП по парралельным вычислениям - там курили собственную реализацию MPI. Так вот оно без дополнительного транслятора ну никак не работает, а инфа для него берётся из правильно составленных комментариев в коде.Неясно, причем тут MPI.
Далее - эти директивы обрабатываются отдельно (до компилятора) специальным транслятором, который из них как раз и делает fork (и тд а так же добавляет проверку на количество процов. Я год отходил на спецсем на СП по парралельным вычислениям - там курили собственную реализацию MPI. Так вот оно без дополнительного транслятора ну никак не работает, а инфа для него берётся из правильно составленных комментариев в коде.Эти директивы не могут обрабатываться отдельно от компилятора, поскольку влияют непосредственно на создаваемый код. Конечно, у них есть свой обработчик, который в промежуточное представление навставляет директив, которые потом словерятся в вызовы в библиотеку omp. Только он также есть часть компилятора.
что-то я не понял, неужели это такая большая проблема? icc уже давно умеет автоматически параллелить циклы (именно параллелить, а не векторизовать и др.) Это, конечно, только циклы, но в цитате только технические аргументы какие-то, должно быть из-за них и циклы проблемно распараллеливать.Это не проблема вообще. Тот же openMP это все замечательно делает, да и интеловский распараллеливатель тоже на openMP построен. Попробую наш распараллеливатель натравить на код, не ради научного интереса, а так - позырить
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-х ядерной машинке померять
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
------------------------------------------------------------------------
Ну вот наконец то флокал родил дельный совет вместо глумеления над ТС
ТС, копай в сторону распараленивая своего кода, как показал там все хорошо, и просто запуском паралельного года на том же камне что есть у тебя можно добиться улучшения скорости в несколько раз.
Ну вот, а то не бывает все сложно и т.д, а люди взяли и написали нормальный продукт.Не надо передёргивать. Я сказал, что для распараллеливания нужно исходный код корячить ооочень сильно, чем обычные компиляторы не занимаются.
А вот этот продук ну никак нельзя назвать обычным компиляторос. Когда его включат в gcc или clang, тогда можно будет сказать, что компилятор сам распараллеливает. А пока нужна сторонняя тулза для этого. И замечу, что не факт, что всё пройдёт гладко и полученный код выдаст тот же результат, что и линейная версия. Отчасти поэтому такого ещё нет в компиляторах общего назначения - с багами не разргебёшься.
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, не знаю, почему так медленно
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, не знаю, почему так медленно
что-то я не понял, неужели это такая большая проблема? icc уже давно умеет автоматически параллелить циклы (именно параллелить, а не векторизовать и др.) Это, конечно, только циклы, но в цитате только технические аргументы какие-то, должно быть из-за них и циклы проблемно распараллеливать.Это типа "я плохо разбираюсь в теме, поэтому наверно ты не прав"? :-D
Как ты себе представляешь параллельную работу в рамках одного приложения? Это или создаётся новый процесс (fork) или тред (pthread_create) - кто за автора кода должен такое вызывать и ещё обрабатывать все исключительные ситуации?
Неясно, причем тут MPI.
Подумай ещё раз - может догадаешься, что это пример того, как пишутся расчёты для многопроцессорных систем.
Эти директивы не могут обрабатываться отдельно от компилятора, поскольку влияют непосредственно на создаваемый код. Конечно, у них есть свой обработчик, который в промежуточное представление навставляет директив, которые потом словерятся в вызовы в библиотеку omp. Только он также есть часть компилятора.Эти директивы, о которых я говорил, помещаются в комментариях (и кажись в #define). И обычный компилятор их попросту игнорирует. Но после обработки такого кода дополнительной прослойкой транслятором, который как раз и добавляет все необходимые вызовы в библиотеку MPI, получается распараллеленный код.
Может за последние лет 10 они уже что-то существенно изменили - я на этот спецсем ходил в 2000ом году, а тогда это было именно так.
Эти директивы, о которых я говорил, помещаются в комментариях (и кажись в #define). И обычный компилятор их попросту игнорирует. Но после обработки такого кода дополнительной прослойкой транслятором, который как раз и добавляет все необходимые вызовы в библиотеку MPI, получается распараллеленный код.openmp.org - загляни.
Может за последние лет 10 они уже что-то существенно изменили - я на этот спецсем ходил в 2000ом году, а тогда это было именно так.
Первая версия стандарта в 1997 году вышла. Почти все современные компиляторы поддерживают OpenMP, так что не вижу в чем вообще трудности. Опять же есть несколько компиляторов вообще автораспараллеливанием занимается.
Я вообще думал, что все понимают, что автор в данный момент всеголишь тестирует скорость однопоточного вычисления и потом может легко экстраполировать результат на 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 раза быстрее!
Параллельно
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:
так что не вижу в чем вообще трудностиПокажи опции GCC, которые надо указать, чтобы код был распараллелен, но ты не должен сам модифицировать исходники автора.
То же самое на 24 ядрахhttp://static.diary.ru/userdir/2/2/8/2/2282305/66343388.jpg
Это не 24 ядра - это 12 ядер с гипертредингом.
Наша надстройка над gcc без опций распараллелит
Интел icc -parallel
Есть еще несколько компиляторов в большей или меньшей степени способных на это PathScale, PLUTO и т.д.
А как ты ее параллелил?
http://static.diary.ru/userdir/2/2/8/2/2282305/66343388.jpgОк, на 24 потоках - так устроит?
Это не 24 ядра - это 12 ядер с гипертредингом.
А как ты ее параллелил?http://optimitech.com/ru_004.htm
В общем проект сначала заглох, потом пополз в другом направлении, но бетка более-менее рабочая есть )
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.
еще раз скорректировал
PathScaleЧто-то платное, в названии есть слово compiller, с документацие о том, как его установить на Ubuntu 7 и 8 - оно точно ещё живое?
Не знаю, я его н лет назад смотрел...
Как ты себе представляешь параллельную работу в рамках одного приложения? Это или создаётся новый процесс (fork) или тред (pthread_create) - кто за автора кода должен такое вызывать и ещё обрабатывать все исключительные ситуации?ну посмотри уже icc -parellel, я о нем. В чем тут я не разбираюсь-то? Ты вот путаешь MPI с чем-то, это совершенно другая вещь по отношению к OpenMP и на одном узле им редко пользуются (если вообще не только для тестирования или от отсутствия другой версии параллельной программы).
В ответ на:Серьезные ребята. =) Ну а что - в полуавтоматическом режиме параллелит.
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.
В gcc что-то пыжились-пыжились, но ничего серьезного пока не родили.Я тебе об этом с самого начала говорил.
Наша надстройка над gcc без опций распараллелит
Мля! Так это и есть транслятор! Оно генерит код (такой же C/CPP код, только с нужными вызовами в библиотеку, а может и само вызывает fork/pthread_create) и скармливает этот код компилятору общего назначения. О чём я говорю с самого начала.
Интел icc -parallel
Я бы лучше руками распареллелил или хотя бы OpenMP полистал, но не стал бы распараллеливание матрасчётов доверять компилятору.
Это -parallel сделано скорее для ПО общего назначения - для конечного хомячка даст прирост в несколько процентов, а то и десятков процентов в каком-нибудь офисном приложении или браузере. Но это не панацея и, IMHO, для целей автроа явно не подходит.
хотя, ладно, на NUMA пользуются, наверное, все же
Мля! Так это и есть транслятор! Оно генерит код (такой же C/CPP код, только с нужными вызовами в библиотеку MPI, а может и само вызывает fork/pthread_create) и скармливает этот код компилятору общего назначения. О чём я говорю с самого начала.Вообще это компилятор промежуточных представлений, просто, помимо всего прочего, генерит вызовы в библиотеку openMP. Считай это один из проходов компилятора по лицензионным соображениям вынесенный в отдельное приложение. В интеле автораспараллеливание тоже фаза компилятора.
Я бы лучше руками распареллелил или хотя бы OpenMP полистал, но не стал бы распараллеливание матрасчётов доверять компилятору.Значит делать ассемблер компилятору доверить можно, а параллелизм сделать нет? Этот -параллел как раз для рассчетов предназначен - в обычном софте он и не сработает нигде по большому счету. Топикстартеру нужно взботнуть openMP и его программа станет параллельной при помощи 2х строчек - это точно.
Это -parallel сделано скорее для ПО общего назначения - для конечного хомячка даст прирост в несколько процентов, а то и десятков процентов в каком-нибудь офисном приложении или браузере. Но это не панацея и, IMHO, для целей автроа явно не подходит.
Значит делать ассемблер компилятору доверить можноВообще-то это основная его задача, "если чё". :-P
-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 та же фигня
-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 та же фигня
Ну результат же нигде не используется, зачем что-то там вычислять? Интел, сцуко, умный
-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
Все интереснее и интереснее
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
добавил
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 (см. пост ниже) бинарник тот-же
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
Если алгоритм можно распараллелить, то может CUDA попробовать?
непараллельно
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
Добавил в таблицу
задача ставится так, что необходимо понять производительность для CPU. Про cuda речи в постановке задачи не идет.
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
Phenom II X4 955 @ 3.61GHzЗапустил тоже самое под VMWare 7.1.4 (у гостевой системы 2 ядра, ОС - WinXP sp3) и под VirtualPC(стандартный windows xp mode получил следующие результаты:
Win7 64bit
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
Похоже у виртуальных машин неадекватно работает счётчик времени, впрочем нормально это не проверить, разница в скорости очень маленькая
подкорректировал
Похоже у виртуальных машин неадекватно работает счётчик времениВполне адекватно задаче) Он смещается на то количество квантов времени, которое недосталось виртуалке, в результате чего время в виртуальной машине течет непрерывно
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
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
Как разгоню - повторю.
Оставить комментарий
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