LINUX.ORG.RU
решено ФорумTalks

Давайте померяемся (benchmark для умножения матриц)


0

0

Написал когда-то давно benchmark для умножения матриц.
Интересно, как результаты зависят от машины.
Попробуйте на самых разных машинах, скажите, что выдала программа, версию компилятора, и скажите на какой машине это вычислено.

%--- This software is Public Domain, author: pacify
%--- solid-linux.org.ru.c
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>

#define M 500
#define N 500
#define FXX double

#define DEFM1(A) FXX A[M*N]
#define ADDR1(A,i,j) A[i*N+j]
#define KILL1(A,B,C)
#define INIT1(A,B,C) \
    for (i=M-1;i>0;i--) for (j=N-1;j>0;j--) ADDR1(C,i,j) = 0; \
    for (i=M-1;i>0;i--) for (j=N-1;j>0;j--) ADDR1(A,i,j) = ADDR1(B,i,j) = (i*j)/(FXX)(M*N);
#define CALC1 for (i=M-1;i>0;i--) for (j=N-1;j>0;j--) { TMP1=0; for (k=N-1;k>0;k--) TMP1 += ADDR1(A1,i,k) * ADDR1(B1,k,j); ADDR1(C1,i,j) = TMP1;}
#define SUMM1 SUM1=0; for (i=M-1;i>0;i--) for (j=N-1;j>0;j--) SUM1+=ADDR1(C1,i,j);

#define DEFM2(A) FXX A[M][N]
#define ADDR2(A,i,j) A[i][j]
#define KILL2(A,B,C)
#define INIT2(A,B,C) \
    for (i=M-1;i>0;i--) for (j=N-1;j>0;j--) ADDR2(C,i,j) = 0; \
    for (i=M-1;i>0;i--) for (j=N-1;j>0;j--) ADDR2(A,i,j) = ADDR2(B,i,j) = (i*j)/(FXX)(M*N);
#define CALC2 for (i=M-1;i>0;i--) for (j=N-1;j>0;j--) { TMP2=0; for (k=N-1;k>0;k--) TMP2 += ADDR2(A2,i,k) * ADDR2(B2,k,j); ADDR2(C2,i,j) = TMP2;}
#define SUMM2 SUM2=0; for (i=M-1;i>0;i--) for (j=N-1;j>0;j--) SUM2+=ADDR2(C2,i,j);

int main (int argc, char **argv) {
    DEFM1(A1); DEFM1(B1); DEFM1(C1);
    DEFM2(A2); DEFM2(B2); DEFM2(C2);
    unsigned int i;
    register unsigned int j,k;
    register FXX TMP1,TMP2;
    FXX SUM1,SUM2;
    clock_t T1,T2,T3,T4;
    double delta,d1,d2,d3,d4;
    INIT1(A1,B1,C1) T1=clock(); CALC1 T2=clock(); SUMM1
    INIT2(A2,B2,C2) T3=clock(); CALC2 T4=clock(); SUMM2
    KILL1(A1,B1,C1) KILL2(A2,B2,C2)
    delta=((double)((T4-T3)-(T2-T1)))/CLOCKS_PER_SEC;
    d1=((double)((T2-T1)))/CLOCKS_PER_SEC;
    d2=((double)((T4-T3)))/CLOCKS_PER_SEC;
    printf("%7d%7d%7d",M,N,(M*N));
    printf("%12.5lf%12.5lf%12.5lf",d1,d2,delta);
    printf("%15.7E%15.7E",SUM1/(M*N),SUM2/(M*N));
    printf("\n");
    return 0;
}

%--- Makefile-linux.org.ru

NAME = solid-linux.org.ru
OPTS = -O7 -fforce-mem -ffast-math -fstrength-reduce
GCC  = gcc

result : ${NAME}.c
        ${GCC} -S ${OPTS} -o ${NAME}.S ${NAME}.c
        ${GCC} ${OPTS} -o ${NAME} ${NAME}.c
        strip --strip-all ${NAME}

%--- что набрать в командной строке

% make -f Makefile-linux.org.ru
% ulimit -s 65536
% ./solid-linux.org.ru

%--- END
★★★★★

First-chance exception in Matrix_bench.exe: 0xC00000FD: Stack Overflow. Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86, Visual Studio 6, WinXP :D

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (09.02.2007 22:34:07):

> ...Stack Overflow.

Ну сказано же, стэк побольше нужен! Уже 2 раза сказано, в том числе и автором бенчмарка в изначальном посте :-)

Die-Hard ★★★★★
()
Ответ на: комментарий от Deleted

2Dimez :

> А ты попробуй более стабильную версию gcc поставить, например, 4.1.х(или 3.4.6) Вроде как 4.0.х - не хочень хороша в плане выдаваемых бинарей.

Короче, чудеса...

Я вспомнил, что ставил как-то на кластере gcc-3.3.5 Прокомпилил им, запустил -- вааще лажа, все больше секунды!

Перекомпилил как днем, запустил -- опять лажа!

Тут я вспомнил, что админ кластера сегодня переустанавливал ядро (почему-то некоторые ноды молча вешаются; мы четырехкорные компы прикупили пару недель назад, и админ откатил с предустановленной Сюзи на 10.0 для однообразия с остальным кластером -- начались чудеса). Я посмотрел -- частота проца понижена до одного гига...

Проблема в том, что админ закрыл доступ руту по сети, только безпарольно с сервера. И, похоже, забыл про тот нод, на котором я днем бенчмарки гонял (он, типа, на меня эксклюзивно зарезервирован). Короче, я могу зайти под рутом на все новые ноды, кроме того, на котором гонял бенчмарки днем. А админ уже пошел бухать, мобила не отвечает, дома его нет; а идти до консоли очень далеко, поскольку я уже дома...

Короче, я зашел на точно такой же нод, разогнал его до номинальной частоты и прогнал бенчмарк.

Результат:

gcc-3.3.5 (3 прогона для статистики):

500 500 250000 0.67000 0.57000 -0.10000 4.1375749E+01 4.1375749E+01

500 500 250000 0.66000 0.57000 -0.09000 4.1375749E+01 4.1375749E+01

500 500 250000 0.67000 0.58000 -0.09000 4.1375749E+01 4.1375749E+01

gcc-4.0.2 (3 прогона для статистики дали одно и то же):

500 500 250000 0.56000 0.65000 0.09000 4.1375749E+01 4.1375749E+01

Точно такой же нод, что и днем:

$grep 'model name' /proc/cpuinfo

model name : Dual-Core AMD Opteron(tm) Processor 2218

model name : Dual-Core AMD Opteron(tm) Processor 2218

model name : Dual-Core AMD Opteron(tm) Processor 2218

model name : Dual-Core AMD Opteron(tm) Processor 2218

Но ядро другое:

$uname -a

Linux d01 2.6.20-smp #4 SMP Thu Feb 8 14:46:30 CET 2007 x86_64

То есть, два вывода:

1. gcc-3.3.5 ощутимо тормознутее, чем gcc-4.0.2, в одних ситуациях, и ощутимо шустрее -- в других;

2. бенчмарки, выполненные днем (на другом ядре), существенно лучше, чем те, что я только что сделал.

Может, конечно, админ нечто непотребное сотворил, я не знаю... И, опять же, нод-то, хотя и такой же, но другой... Прояснится вопрос только в понедельник.

Die-Hard ★★★★★
()

Кто бы объяснил ещё, что вся эта цифирь означает... проц - атлончег о 2.2ГГц.

500 500 250000 0.60000 0.60000 0.00000 4.1375749E+01 4.1375749E+01

Gharik
()
Ответ на: комментарий от Gharik

> 500 500 250000 0.60000 0.60000 0.00000 4.1375749E+01 4.1375749E+01

> Кто бы объяснил ещё, что вся эта цифирь означает... проц - атлончег о 2.2ГГц.

А компилятор какой ?

500 - число строк матрицы
500 - число столбцов матрицы
(сейчас только для квадратных)
250000 - число элементов матрицы
0.60000 - время умножения матриц первым способом
0.60000 - время умножения матриц вторым способом
0.00000 - дельта по времени
4.1375749E+01 - среднее значение элементов результирующей матрицы
4.1375749E+01 - среднее значение элементов результирующей матрицы

pacify ★★★★★
() автор топика

2pacify:

Если не лень -- добавь еще два теста, где бы циклы крутились в другую сторону :-)

У меня есть подозрение, что компилятор соптимизирует for (i=0;i<M;i++) лучше, чем for (i=M-1;i>0;i--)... Может быть, паранойа, но интересно!

Die-Hard ★★★★★
()
Ответ на: комментарий от pacify

> А компилятор какой ?

Мсье, куда спешить? Счас скажу...

Target: x86_64-pc-linux-gnu
...
gcc version 4.1.1 (Gentoo 4.1.1-r3)

Собственно, весь мир им и пересобран со зловещим флагом "-e".

Gharik
()

C:\VC>ver

Microsoft Windows XP [Version 5.1.2600]

C:\VC>set | agrep -i processor NUMBER_OF_PROCESSORS=1 PROCESSOR_ARCHITECTURE=x86 PROCESSOR_IDENTIFIER=x86 Family 15 Model 12 Stepping 0, AuthenticAMD PROCESSOR_LEVEL=15 PROCESSOR_REVISION=0c00

C:\VC>cl /Ox /F10000000 solid-linux.org.ru.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86 Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

solid-linux.org.ru.c Microsoft (R) Incremental Linker Version 7.10.3077 Copyright (C) Microsoft Corporation. All rights reserved.

/out:solid-linux.org.ru.exe /stack:10000000 solid-linux.org.ru.obj

C:\VC>solid-linux.org.ru.exe 500 500 250000 0.92100 0.92200 0.00100 4.1375749E+001 4.1375749E+001

anonymous
()
Ответ на: комментарий от Gharik

2Gharik (10.02.2007 2:48:10):

А че не так-то?

Мне, например, очень интересно... Еще одна платформа, описание и результат "в студии"...

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> Если не лень -- добавь еще два теста, где бы циклы крутились в другую сторону :-)

Ok.

> У меня есть подозрение, что компилятор соптимизирует
> for (i=0;i<M;i++) лучше, чем for (i=M-1;i>0;i--)... Может быть,
> паранойа, но интересно! 

Как и предполагалось, ты ошибся - декремент работает быстрее ))

%--- solid-incmod.c

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

#define M 500
#define N 500
#define FXX double

#define DEFM1(A) FXX A[M*N]
#define ADDR1(A,i,j) A[i*N+j]
#define KILL1(A,B,C)
#define INIT1(A,B,C) \
    for (i=1;i<M;i++) for (j=1;j<N;j++) ADDR1(C,i,j) = 0; \
    for (i=1;i<M;i++) for (j=1;j<N;j++) ADDR1(A,i,j) = ADDR1(B,i,j) = (i*j)/(FXX)(M*N);
#define CALC1 for (i=1;i<M;i++) for (j=1;j<N;j++) { TMP1=0; for (k=1;k<N;k++) TMP1 += ADDR1(A1,i,k) * ADDR1(B1,k,j); ADDR1(C1,i,j) = TMP1;}
#define SUMM1 SUM1=0; for (i=1;i<M;i++) for (j=1;j<N;j++) SUM1+=ADDR1(C1,i,j);

#define DEFM2(A) FXX A[M][N]
#define ADDR2(A,i,j) A[i][j]
#define KILL2(A,B,C)
#define INIT2(A,B,C) \
    for (i=1;i<M;i++) for (j=0;j<N;j++) ADDR2(C,i,j) = 0; \
    for (i=1;i<M;i++) for (j=0;j<N;j++) ADDR2(A,i,j) = ADDR2(B,i,j) = (i*j)/(FXX)(M*N);
#define CALC2 for (i=1;i<M;i++) for (j=1;j<N;j++) { TMP2=0; for (k=1;k<N;k++) TMP2 += ADDR2(A2,i,k) * ADDR2(B2,k,j); ADDR2(C2,i,j) = TMP2;}
#define SUMM2 SUM2=0; for (i=1;i<M;i++) for (j=1;j<N;j++) SUM2+=ADDR2(C2,i,j);

int main (int argc, char **argv) {
    DEFM1(A1); DEFM1(B1); DEFM1(C1);
    DEFM2(A2); DEFM2(B2); DEFM2(C2);
    unsigned int i;
    register unsigned int j,k;
    register FXX TMP1,TMP2;
    FXX SUM1,SUM2;
    clock_t T1,T2,T3,T4;
    double delta,d1,d2,d3,d4;
    INIT1(A1,B1,C1) T1=clock(); CALC1 T2=clock(); SUMM1
    INIT2(A2,B2,C2) T3=clock(); CALC2 T4=clock(); SUMM2
    KILL1(A1,B1,C1) KILL2(A2,B2,C2)
    delta=((double)((T4-T3)-(T2-T1)))/CLOCKS_PER_SEC;
    d1=((double)((T2-T1)))/CLOCKS_PER_SEC;
    d2=((double)((T4-T3)))/CLOCKS_PER_SEC;
    printf("%7d%7d%7d",M,N,(M*N));
    printf("%12.5lf%12.5lf%12.5lf",d1,d2,delta);
    printf("%15.7E%15.7E",SUM1/(M*N),SUM2/(M*N));
    printf("\n");
    return 0;
}

%--- bash

$ ./solid-incmod 
    500    500 250000    11.23000    11.20000    -0.03000  4.1375749E+01  4.1375749E+01

$ ./solid-linux.org.ru 
    500    500 250000     9.81000     9.81000     0.00000  4.1375749E+01  4.1375749E+01

%--- END

$ uname -a
Linux optima 2.6.19 #1 Sun Feb 4 23:44:06 MSK 2007 i686 GNU/Linux

$ gcc --version | head -1
gcc (GCC) 3.3.5 (Debian 1:3.3.5-13)

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

pacify:

> Как и предполагалось, ты ошибся - декремент работает быстрее ))

А что, есть обоснование? Очень интересно...

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Простейший тест погонял на своем ноутбуке:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include <stdio.h>
#include <time.h>
#include <stdlib.h>


volatile int buf[65536001];

int main(void)
{
int i,j,acc;
clock_t b;
   b=clock();
   for(acc=i=65536000; i>=0; i--);
   printf("Starting stub:%ld\n",clock()-b);

   b=clock();
   for(acc=i=0; i<65536001; i++){
      for(j=0; j<16;j++)
         acc+=buf[i];
   }
   printf("inc:%ld\n",clock()-b);

   b=clock();
   for(acc=i=0; i<65536001; i++){
      for(j=0; j<16;j++)
         acc+=buf[i];
   }
   printf("inc:%ld\n",clock()-b);

   b=clock();
   for(acc=i=0; i<65536001; i++){
      for(j=0; j<16;j++)
         acc+=buf[i];
   }
   printf("inc:%ld\n",clock()-b);

   b=clock();
   for(acc=i=0; i<65536001; i++){
      for(j=0; j<16;j++)
         acc+=buf[i];
   }
   printf("inc:%ld\n",clock()-b);

   b=clock();
   for(acc=i=65536000; i>=0; i--);
   printf("Switch stub:%ld\n",clock()-b);


   b=clock();
   for(acc=i=65536000; i>=0; i--){
      for(j=0; j<16;j++)
         acc+=buf[i];
   }
   printf("dec:%ld\n",clock()-b);

   b=clock();
   for(acc=i=65536000; i>=0; i--){
      for(j=0; j<16;j++)
         acc+=buf[i];
   }
   printf("dec:%ld\n",clock()-b);

   b=clock();
   for(acc=i=65536000; i>=0; i--){
      for(j=0; j<16;j++)
         acc+=buf[i];
   }
   printf("dec:%ld\n",clock()-b);

   b=clock();
   for(acc=i=65536000; i>=0; i--);
   printf("Fin stub:%ld\n",clock()-b);

   printf("acc=%d j=%d\n",acc,j);
   return 0;
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
gcc -O0 -o inc_dec inc_dec.c
./inc_dec
Starting stub:100000
inc:5510000
inc:5310000
inc:5370000
inc:5350000
Switch stub:100000
dec:5370000
dec:5390000
dec:5380000
Fin stub:110000
acc=65536000 j=16

gcc -O1 -o inc_dec inc_dec.c
./inc_dec
Starting stub:40000
inc:1460000
inc:1140000
inc:1040000
inc:1390000
Switch stub:30000
dec:1280000
dec:930000
dec:860000
Fin stub:40000
acc=65536000 j=16

gcc -O2 -o inc_dec inc_dec.c
./inc_dec
Starting stub:40000
inc:1500000
inc:1490000
inc:1580000
inc:1690000
Switch stub:40000
dec:870000
dec:900000
dec:960000
Fin stub:40000
acc=65536000 j=16

gcc -O2 -funroll-loops -o inc_dec inc_dec.c
./inc_dec
Starting stub:0
inc:860000
inc:790000
inc:790000
inc:790000
Switch stub:10000
dec:790000
dec:790000
dec:790000
Fin stub:10000
acc=65536000 j=16

Итого:
Без оптимизации инкремент и декремент одинаковы, с оптимизациями декремент выгоднее(?), с полной раскруткой циклов (тут циклы на константах!) декремент и инкремент не различаются...

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> А что, есть обоснование? Очень интересно...

for (i=0;i<M;i++)
for (i=M-1;i>0;i--)

Сравнение с 0-ем может быть быстрее, так как можно обойтись двумя инструкциями (dec и "jump_if_zero").

Компилятор, конечно, штука умная сегодня... но и про свою соображалку не надо забывать.

logIN
()
Ответ на: комментарий от logIN

2logIN:

> Сравнение с 0-ем может быть быстрее, так как можно обойтись двумя инструкциями (dec и "jump_if_zero").

Лень смотреть на ассеблерный код сейчас... Но что-то мне подсказывает, что инструкции будут примерно одинаковы!

BTW, я думал в направлении префетчинга, вообще-то...

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

:$

C:\src\MATRIX~1>set|grep processor
File STDIN:
NUMBER_OF_PROCESSORS=1
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 6 Stepping 2, AuthenticAMD
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0602

C:\src\MATRIX~1>ver

Microsoft Windows XP [Версия 5.1.2600]


C:\src\MATRIX~1>cl /F10000000 /Ox solid-linux.org.ru.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

solid-linux.org.ru.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:solid-linux.org.ru.exe
/stack:10000000
solid-linux.org.ru.obj

C:\src\MATRIX~1>solid-linux.org.ru.exe
500 500 250000 2.68800 2.70300 0.01500 4.1375749E+001 4.13757
49E+001


anonymous
()

Итак, подводим итоги меряния процессорами.

 0.50000 |  0.57000 | gcc-4.0.2 | linux-2.6.13 SMP x86_64 | 2x(Dual-Core AMD Opteron 2218) | 2.6 GHz | Die-Hard
 0.52000 |  0.89000 | icc-9.0   | linux-2.6.13 SMP x86_64 | 2x(Dual-Core AMD Opteron 2218) | 2.6 GHz | Die-Hard
 0.54000 |  0.54000 | gcc-3.4.6 (RedHat 3.4.6-3) | ? | 4x(Dual Core AMD Opteron 280) | ? | Dimez
 0.59000 |  0.69000 | gcc-4.0.2 | linux-2.6.13 SMP x86_64 | 4x(Dual-Core AMD Opteron 880) | 2.4 GHz | Die-Hard
 0.60000 |  0.60000 | gcc-4.1.1 (Gentoo 4.1.1-r3) | ? | AMD Athlon 64 | 2.2 GHz | Gharik
 0.61000 |  0.67000 | gcc-4.0.2 | linux-2.6.13 SMP x86_64 | 2x(AMD Opteron 248) | 2.2 GHz | Die-Hard
 0.61000 |  1.05000 | icc-9.0   | linux-2.6.13 SMP x86_64 | 4x(Dual-Core AMD Opteron 880) | 2.4 GHz | Die-Hard
 0.63000 |  0.64000 | gcc-4.1.1 (RedHat 4.1.1-51) | linux-2.6.19-1.2895.fc6 | Intel Core 2 Duo 6600 | ? | jr_A
 0.63000 |  0.98000 | icc-9.0   | linux-2.6.13 SMP x86_64 | 2x(AMD Opteron 248) | 2.2 GHz | Die-Hard
 0.63830 |  0.62757 | icc-8.0   | linux-2.4.21-sgi302r24 SMP | 32x(Intel Itanium-2) (sgi altix 3700) | 1300 MHz | Die-Hard
 0.65000 |  0.70000 | gcc-4.1.2 rc1 | ? | AMD Sempron 3400 | ? | birdie
 0.67000 |  0.67000 | gcc-4.1.1 (RedHat 4.1.1-51) | linux-2.6.19-1.2895.fc6 | Intel Core 2 Duo 6600 | ? | jr_A
 0.77000 |  0.72000 | gcc-4.1.3 | ? | AMD Athlon 64 3200+ | ? | anonymous
 0.79000 |  0.96000 | ?         | linux 2.6.19-1.2895.fc6 SMP x86_64 | AMD Athlon 64 3000+ | ? | hooj
 0.92100 |  0.92200 | msvc (?)  | Microsoft Windows XP [Version 5.1.2600] | AMD ? | ? | anonymous
 0.94000 |  1.03000 | gcc-4.1.3 | ? | 2x(Intel Xeon 5110) | 1.60 GHz | anonymous
 0.98000 |  1.13000 | gcc 4.1.2 | linux-2.6.17-10-generic i686 | Intel Pentium M | 1.70 GHz | beastie
 1.02000 |  0.96000 | gcc-4.1   | linux-2.6.17-10-generic i686 | AMD Turion64 X2 3200+ | ? | hibou
 1.08000 |  1.12000 | gcc-4.1.1 | linux-2.6.19-1.2895.fc6 SMP | 2x(Intel Pentium D | 3.40 GHz | Shaman007
 1.16000 |  1.10000 | ?         | linux-2.6.18-gentoo-r6 i686 | Intel Pentium 4 | 3.40 GHz | owlfog
 1.26000 |  1.25000 | gcc-3.4.5 | sunos-5.10 | Intel Pentium 4 640 | 3200 MHz | anonymous
 1.43000 |  1.42000 | ?         | linux-2.6.15-27-686 SMP i686 | Intel Pentium D 805 | ? | Motiv_studenta
 1.59000 |  1.60000 | gcc-4.1.3 | ? | Intel Pentium 4 | 2.40 GHz | anonymous
 2.01934 |  1.74899 | gcc-3.2.3 (RedHat Linux 3.2.3-34) | linux-2.4.21-sgi302r24 SMP | 32x(Intel Itanium-2) (sgi altix 3700) | 1300 MHz | Die-Hard
 2.02000 |  2.02000 | gcc-3.4.6 | linux-2.6.17-gentoo-r5 i686 | AMD Athlon XP 2400+ | ? | rip_someday
 2.17000 |  2.18000 | gcc-3.3.5 | openbsd-4.0 i386 | Athlon XP 2200+ | ? | beastie
 2.25000 |  2.06000 | gcc-4.1.3 | ? | Intel Celeron | 2.53 GHz | anonymous
 2.29000 |  2.16000 | gcc-4.1.3 | ? | Intel Celeron | 2.13 GHz | anonymous
 2.44000 |  2.41000 | gcc-4.1.3 | ? | AMD Athlon XP 2200+ | ? | anonymous
 2.68800 |  2.70300 | msvc (?)  | Microsoft Windows XP [Version 5.1.2600] | AMD ? | ? | anonymous
 3.23000 |  3.24000 | gcc-3.4.6 | ? | 2x(Intel Pentium 3) | 750 MHz | sdio
 3.26000 |  3.33000 | gcc-4.1.2 | ? | 2x(Intel Pentium 3) | 750 MHz | sdio
 3.44000 |  3.37000 | gcc-4.1.1 | linux-2.6.18.3 i686 | AMD Athlon XP | 1100MHz | Juicy_Grape
 4.73314 |  4.51649 | cxx 6.3-002 | OSF1 V5.1 1885 alpha | alpha EV6.7 (21264A) | 667 MHz | Die-Hard
 4.83314 |  4.61648 | gcc-2.95.3 | OSF1 V5.1 1885 alpha | alpha EV6.7 (21264A) | 667 MHz | Die-Hard
10.40000 | 10.45000 | gcc-3.3.5 | linux-2.6.19 i686 | AMD Duron | 700 MHz | pacify
16.93400 | 17.04500 | Borland C++ Builder 6, no optimization, i386 | Microsoft Windows XP [Version 5.1.2600] | Intel Celeron | 668 MHz | pacify
18.20600 | 17.10500 | Borland C++ Builder 6, optimization for speed, Pentium | Microsoft Windows XP [Version 5.1.2600] | Intel Celeron | 668 MHz | pacify

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

buba@stormdog:~$ ./solid-linux.org.ru 500 500 250000 1.43000 1.49000 0.06000 4.1375749E+01 4.1375749E+01

Celeron M 1.5, кэш 1Мб, gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5), запущено много всякого, ядро 2.6.19.2 ванильное. Запуск в 4 потока:

500 500 250000 1.66000 1.48000 -0.18000 4.1375749E+01 4.1375749E+01

500 500 250000 1.23000 1.48000 0.25000 4.1375749E+01 4.1375749E+01

500 500 250000 1.23000 1.48000 0.25000 4.1375749E+01 4.1375749E+01

500 500 250000 1.24000 1.48000 0.24000 4.1375749E+01 4.1375749E+01

Buba
()
Ответ на: комментарий от Buba

И еще проверил с gcc version 3.3.6 (Ubuntu 1:3.3.6-10). Результаты с большим разбросом, но в среднем примерно так:

500 500 250000 1.78000 1.44000 -0.34000 4.1375749E+01 4.1375749E+01

Отрицательная дельта тоже почти всегда. Для 4 потоков:

500 500 250000 1.40000 1.35000 -0.05000 4.1375749E+01 4.1375749E+01 500 500 250000 1.28000 1.43000 0.15000 4.1375749E+01 4.1375749E+01 500 500 250000 1.31000 1.18000 -0.13000 4.1375749E+01 4.1375749E+01 500 500 250000 1.43000 1.34000 -0.09000 4.1375749E+01 4.1375749E+01

Buba
()
Ответ на: комментарий от Die-Hard

> А че не так-то? > Мне, например, очень интересно... Еще одна платформа, описание и результат "в студии"...

Да впечатлило количество плясок и синтаксис команд. Думал больше не увижу никогда этого изврата - ан нет :)

Gharik
()

[mutronix@mutronix ~]$ gcc --version
gcc (GCC) 4.1.1 (Gentoo 4.1.1)
Copyright (C) 2006 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.
[mutronix@mutronix ~]$ uname -a
Linux mutronix 2.6.18-gentoo-r4 #4 Fri Dec 22 21:27:20 YAKT 2006 x86_64 AMD
Athlon(tm) 64 Processor 3000+ GNU/Linux
[mutronix@mutronix ~]$ file solid-linux.org.ru
solid-linux.org.ru: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for
GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
[mutronix@mutronix ~]$ ./solid-linux.org.ru
500 500 250000 0.75000 0.76000 0.01000 4.1375749E+01 4.1375749E+01
[mutronix@mutronix ~]$ ./solid-linux.org.ru
500 500 250000 0.76000 0.76000 0.00000 4.1375749E+01 4.1375749E+01
[mutronix@mutronix ~]$ ./solid-linux.org.ru
500 500 250000 0.75000 0.75000 0.00000 4.1375749E+01 4.1375749E+01

[mutronix@arch tmp]$ gcc --version
gcc (GCC) 4.1.2 20061027 (prerelease)
Copyright (C) 2006 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.
[mutronix@arch tmp]$ uname -a
Linux arch 2.6.19-ARCH #1 SMP PREEMPT Tue Dec 12 12:47:42 CET 2006 i686 Genuine
Intel(R) CPU T2050 @ 1.60GHz GenuineIntel GNU/Linux
[mutronix@arch tmp]$ cat /proc/cpuinfo | fgrep "model name"
model name : Genuine Intel(R) CPU T2050 @ 1.60GHz
model name : Genuine Intel(R) CPU T2050 @ 1.60GHz
[mutronix@arch tmp]$ ./solid-linux.org.ru
500 500 250000 1.09000 1.11000 0.02000 4.1375749E+01 4.1375749E+01
[mutronix@arch tmp]$ ./solid-linux.org.ru
500 500 250000 1.04000 1.22000 0.18000 4.1375749E+01 4.1375749E+01
[mutronix@arch tmp]$ ./solid-linux.org.ru
500 500 250000 1.07000 1.22000 0.15000 4.1375749E+01 4.1375749E+01

mutronix ★★★★
()

Duron 700, gcc-3.3.5, linux-2.6.19 i686
для long long у меня получилось:
500 500 250000 12.88000 13.12000 0.24000 ...
для long/int:
500 500 250000 2.58000 2.58000 0.00000 ...
для short int:
500 500 250000 2.11000 2.10000 -0.01000 ...
для float:
500 500 250000 2.26000 2.25000 -0.01000 ...
для double:
500 500 250000 9.83000 9.88000 0.05000 ...

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.