vs C

2015-01-19 11:01
ufm: (Default)
[personal profile] ufm

Интересно, это я «не умею их готовить», или с pthread действительно так всё плохо?
Приблизительно 2.5М
Впрочем — было так:

0000000 83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 26 40 26 72 36 = 1138
2578416 45 68 50 62 67 61 57 54 51 64 47 53 61 67 63 67 54 39 66 42 = 1138
5917909 14 80 68 49 56 55 69 44 68 32 77 42 74 63 74 49 54 20 63 87 = 1138
4503224 40 69 58 55 55 56 53 52 54 54 49 53 48 59 49 62 74 73 72 53 = 1138
2627799 79 71 60 53 56 102 45 21 67 32 41 46 56 38 49 73 55 61 78 55 = 1138
2611552 49 48 49 57 51 72 46 53 56 38 52 47 63 79 69 68 49 70 71 51 = 1138

Так что я допускаю, что я действительно не умею готовить.
код — http://pastebin.com/WHfi7hvQ
компилировал так: gcc -O3 -pthread c2.c -o c2
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

Originally published at U.F.M's Homepage. You can comment here or there.

(no subject)

Date: 2015-01-19 12:49 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
% ./atomic-c 
0000000  13  97  98  15  12  43  87   8  98  70  79  82  36  83  73  58   6  57  79  23 = 1117
4822029  64  43  55  57  34  50  51  56  68  58  68  51  44  39  90  71  51  53  49  65 = 1117
5143860  72  57  36  62  53  25  54  18  60  52  43  51  55  46  64  87  72  64  64  82 = 1117
5133991  70  59  46  39  12  90   0  40  12  64   0  92 114  15   3 115  15  76 191  64 = 1117
5146905  40  57  79  62  70   0  55  73  38  74  37  57  57  70  52  62  50  42  78  64 = 1117
5133573  40   8 100  79  72  18  75  63  48  39  33  83  82  62  53  49  25  65  81  42 = 1117
5146227  64  66  71  35  61  75  29  76  62  63  50  61  54  37  56  40  86  78  14  39 = 1117
5134376  99  65  61  40  89  44  56  61  44  53  36  50  47  50  48  44  39  65  70  56 = 1117
5124747  49  60  37  73  45  25  65  58  69  50  58  50  46  92  61  58  33  58  66  64 = 1117
5142015  59  52  78  51  68  48  32  27  61  36  62  60  48  85  46  46  34  62  63  99 = 1117
5142258  42  48  67  66  46  93  42  32  69  46  87  11  35 106  61  35  55  35 107  34 = 1117
5147064  27  33  80  52  55  70  47  45  58  59  46  47  76  48  59  56  67  84  72  36 = 1117
5134242  19  75  64  83  43   8  60  68  65  44  42  57  60  49  56  44  42  75  59 104 = 1117
5140715  50  41  24  65  75  29  53  79  65  73  35  43  46  47  73  54  35  69  72  89 = 1117
5141456  73  45  54  46  55  27  54  62  53  62  37  52  68  26  59  75  41  83  64  81 = 1117
5147799  58  51  62  48  46  57  65  45  60  56  58  61  54  66  49  51  63  48  64  55 = 1117
5149740  88  59  39  56  55  77  64  12  57  24  27  42 103  63  64  43  56  38  55  95 = 1117
5136357  44  31  60  59  71  51  83  46  60  36  56  63  76  70  45  44  61  74  23  64 = 1117
5140129 103  41  41  47  58  67  96  68  40  59  36  30  56  15  20  80  12  43 103 102 = 1117
5149935  90  66  18  65  53  44  52  45  79  63  52  10  36  59  56  65  88  79  47  50 = 1117
5150583  31  81  63  56  58  26  47  70  66  49  57  46  57  55  68  54  39  68  70  56 = 1117
5125022  46  40  61  44  40  12  45  63  87  63  52  78  46  67  75  30  56  90  59  63 = 1117
5141100  64  42  51  52  58  56  18  60  65  56  41  58  61  45  31  77  51  85  84  62 = 1117
5132689  56  64  53  44  64  67  58  47  66  57  41  51  41  64  52  68  14  57  50 103 = 1117
5140052  60  45  36  45  24  48  53  59 123  72  53  37  87  46  60  60  73  41  37  58 = 1117
5147082  74  28  43  57  64  61  62  27  76  58  75  64  52  47  64  11  54  68  68  64 = 1117


это что, 5M надо понимать?
Edited Date: 2015-01-19 12:56 (UTC)

(no subject)

Date: 2015-01-19 12:55 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
но вообще, мне больше нравится так:

% ./atomic-cs
0000000  13  97  98  15  12  43  87   8  98  70  79  82  36  83  73  58   6  57  79  23 = 1117
7514673  76  57  41  57  48  62  38  47  56  57  82  44  46  57  79  76  32  46  58  58 = 1117
7554520  55  47  52  54  81  77  38  62  44  59  60  59  31  52  72  66  63  30  59  56 = 1117
7445425  55  50  42  32  65  50  64  65  58  53  55  18  51  57  60  65  83  75  57  62 = 1117
7483209  55  57  36  59  65  38  53  87  58  68  65  59  69  45  52  39  49  49  65  49 = 1117
7512892  40  68  71  34  49  50  62  62  62  68  64  74  20  78  50  51  63  54  47  50 = 1117
7564572  56  39  75  51  37  80  51  50  59  53  46  40  34  75  88  48  75  43  68  49 = 1117
7494739  87  50   0  54  44  20  59  49  73  71  48  39  96  37  58  46  35  70  70 111 = 1117
7485490  47  47  62  56  63  60  44  62  80  61  36   4  48  58  56  48  78  55  78  74 = 1117
7552926  20  44  77  43  99  62  64  59  62  32  43  53  74  36  81  54  64  62  45  43 = 1117

(no subject)

Date: 2015-01-19 14:25 (UTC)
From: [identity profile] ufm.livejournal.com
Рассказывай.

(no subject)

Date: 2015-01-19 14:28 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
ты считаешь я тебя обманываю? обидеть хочешь?

(no subject)

Date: 2015-01-19 14:33 (UTC)
From: [identity profile] ufm.livejournal.com
Нет, я считаю что ты знаешь какое-то специальное колдунство. И прошу его рассказать. :)
Кстати, если я тебе голаговый бинарник дам - запустишь для сравнения?

(no subject)

Date: 2015-01-19 14:38 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
я думаю у меня на фре он не запустится :)
ну очевидно же, что тут имеется а) lock congestion б) вероятно в твоем случае дополнительно энтропия кончается (тут разница фря vs линух?)

во втором варианте тупо s/pthread_mutex/pthread_spinlock/ -- это с очевидностью следует из а)

(no subject)

Date: 2015-01-19 14:41 (UTC)
From: [identity profile] ufm.livejournal.com
Почему-ж не запустится? Я тебе под фрю соберу.
А вот, кстати, с энтропией - это идея.

(no subject)

Date: 2015-01-19 14:45 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
ок, собирай.
сейчас -- под 9.2 или 10.1 (но это указывай отдельно -- мне надо будет дома запускать, а так тачки одинаковые, может только память разная)

(no subject)

Date: 2015-01-19 15:48 (UTC)
From: [identity profile] ufm.livejournal.com
https://ufm.su/public.php?service=files&t=9240b558d2b2e4961ed0e1aa846a8772
Оно статикой слинковано - так что должно на всём что шевелится запускаться. У меня на 10-0 запустилось.

(no subject)

Date: 2015-01-19 15:53 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
иногда появляются новые сисколы.

sum  ---updates---    mean  buckets
1000 1833081 2087423 3920504  [31 56 46 38 56 46 34 55 31 25 63 38 54 121 33 103 42 64 22 42]
1000 1981866 2261571 4081970  [2 11 32 0 41 85 50 41 39 56 115 104 101 16 42 115 57 55 0 38]
1000 1977260 2259285 4133495  [34 52 23 4 35 149 63 26 36 148 106 40 69 22 9 47 26 4 106 1]
1000 1975336 2258590 4158603  [39 58 57 39 57 13 13 103 92 89 0 38 14 36 17 48 107 103 58 19]
1000 1979304 2259829 4174709  [49 31 38 58 13 49 29 12 143 50 38 51 110 62 7 83 62 31 21 63]
1000 1977785 2262671 4185666  [38 89 22 9 43 27 18 15 35 47 1 16 138 96 98 96 95 62 52 3]
1000 1978776 2258757 4193076  [25 78 35 20 39 42 48 90 27 17 73 82 63 89 27 20 106 33 4 82]
1000 1978000 2260046 4198697  [3 71 22 15 42 25 9 103 43 19 58 24 116 165 145 1 64 23 11 41]
1000 1978830 2261072 4203275  [81 16 166 76 94 20 14 5 13 97 14 116 0 62 70 8 54 36 29 29]
1000 1980924 2256187 4206659  [112 0 2 84 9 7 106 135 76 23 33 0 34 123 0 6 24 138 70 18]
1000 1975032 2261226 4209350  [29 49 32 1 86 76 94 7 32 75 43 66 95 96 4 3 66 67 11 68]
1000 1978538 2256896 4211523  [4 79 9 36 63 15 68 16 64 4 74 12 24 65 85 152 138 63 20 9]


CPU: Intel(R) Xeon(R) CPU X3430 @ 2.40GHz (2394.03-MHz K8-class CPU)
DDR3 1333 MHz

(no subject)

Date: 2015-01-19 16:17 (UTC)
From: [identity profile] ufm.livejournal.com
Вобще - странно. У меня
1000 4164802 4227866 8392668 [42 31 9 66 36 38 57 33 44 18 83 6 130 110 89 33 88 6 41 40]
1000 4175583 4239824 8404037 [52 31 28 42 41 17 41 65 0 64 68 61 3 54 18 155 61 39 48 112]
1000 4217818 4322449 8449447 [5 41 1 26 6 9 82 74 81 66 15 19 21 57 26 58 125 50 188 50]

Intel(R) Core(TM) i7-4700HQ CPU @ 2.40GHz (fam: 06, model: 3c, stepping: 03)
DDR3 1600 Mhz

(no subject)

Date: 2015-01-19 16:26 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
что ты нашел странного?
i7 http://www.cpubenchmark.net/cpu.php?cpu=Intel+Core+i7-4700HQ+%40+2.40GHz Single Thread Rating: 1819
(Launch Date Q2'13, DMI2 5 GT/s)

X3430 http://www.cpubenchmark.net/cpu.php?cpu=Intel+Xeon+X3430+%40+2.40GHz Single Thread Rating: 942
(Launch Date Q3'09, DMI 2.5 GT/s)

в два раза и видим разницу. у меня еще и память тормознее.

(no subject)

Date: 2015-01-19 16:37 (UTC)
From: [identity profile] ufm.livejournal.com
Какой я себе летом лапоть удачный купил... :)

(no subject)

Date: 2015-01-19 16:40 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
кстати, довольно забавные результаты получаются если давать go только одно ядро использовать

(no subject)

Date: 2015-01-19 16:55 (UTC)
From: [identity profile] ufm.livejournal.com
1000 3284124 3817996 7215540 [97 86 11 347 43 0 146 26 13 58 25 23 2 22 12 1 6 0 9 73]
1000 3767603 3759164 7277785 [50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50]
1000 3177429 3669937 7206049 [0 13 1 57 154 28 84 32 48 5 11 2 27 27 149 191 34 2 51 84]
1000 2471496 4727249 7205005 [44 44 13 3 104 9 1 9 0 0 1 46 32 293 32 46 29 256 14 24]
1000 3455113 4000621 7236346 [50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50]

Если ты про 50 50 50 50 - то это понятно.
Что бы такого небыло - надо добавить runtime.Gosched() в transfer(...) в конец добавить. Но тогда скорость упадёт (у меня до 4M).

(no subject)

Date: 2015-01-19 17:06 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
нет, я про другое.
(а что такое 50 50 50 50? я вообще в программу не вникал)
возможно дольше надо погонять

1000 2871860 2540920 5043204  [6 1 90 12 127 2 43 2 24 5 89 100 63 59 87 63 117 75 19 16]
1000 5399054      0 5132166  [50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50]
1000 5246015 115855 5178107  [74 70 118 0 187 1 15 34 1 53 7 82 31 34 25 135 11 55 4 63]


я про ноль во второй колонке (хотя я и не знаю что он должен означать, но глаз режет)

(no subject)

Date: 2015-01-19 18:11 (UTC)
From: [identity profile] ufm.livejournal.com
Собственно задача простая.
Есть массив.
Есть три треда.
Первый - берет два значения из массива и методом отнимания от одного и прибавления другому - старается выравнять все значения.
Второй - вносит хаос. Т.е. берет сколько нибудь у одного значения и присваевает другому.
Третий - время от времени показывает текущее состояние этого массива.
0 во втором столбце - это значит за секунду отработало 0 циклов хаоса (из-за этого-же "50 50 50 ..." - оно успело выровнять все значения). Т.е. без ввода/вывода, без работы с каналами (я не помню когда еще в go шедулер треды переключает, но эти две причины - точно) и на одном ядре зелёные треды у GO достаточно фигово переключаются.

(no subject)

Date: 2015-01-19 17:17 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
вообще, у меня есть некоторое подозрение на принципиально более высокую вычислительную мощу i7/i5/e3 по сравнению с e5 (про соотношение i7/e3 мнения пока не имею). не знаю за счет чего.

CPU: Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz (3392.37-MHz K8-class CPU)
DDR3 1600, емнип.

> ./atomic-c
0000000   7  49  73  58  30  72  44  78  23   9  40  65  92  42  87   3  27  29  40  12 = 880
7818330   5  51  22  42  20  40  50  25  17  33  14  53  24 104 120  26  61  37  53  83 = 880
8234364  65  42  43  36  46  39  39  44  19   9  33  93  13  50  41  58  98  41  71   0 = 880
8003721  35  50  66  50  33  23  33  58  36  52  41  50  25  44  51  54   3  38  84  54 = 880
11362064  24  79  68  18  67  69  23  27  30  94  75  32   0 153  25  25  19  31   0  21 = 880
9063439  28  94  60  45  62  67  92   9  52   0  50  68  47  42  48   7   5  42  35  27 = 880
^C
> ./atomic-cs
0000000   7  49  73  58  30  72  44  78  23   9  40  65  92  42  87   3  27  29  40  12 = 880
10784786   4  73  43  36  32  33  32  65  57  62  32  24  73  67  29  74  49  24   9  62 = 880
10880220  39  40  60   0  43  31  54  77  30  17  61  54  20  45  66  54  52  52  41  44 = 880
10555801  62  29  37   2  35  65  49  41  51  12  45  45  42  71  60  20  56  63  38  57 = 880
15834997  42  24  56  65  38  48  46  50  48  32  45  65  42  27  47  28  15  52  37  73 = 880
^C
> ./go2 
sum  ---updates---    mean  buckets
1000 2602814 3105258 5708072  [61 30 39 56 5 69 34 85 64 6 35 93 21 36 57 8 65 48 49 139]
1000 2664479 3153540 5763045  [98 99 87 57 15 15 57 79 56 38 23 42 51 52 49 83 21 15 56 7]
1000 2592891 3109643 5742875  [24 37 67 42 52 76 19 26 43 60 12 42 109 93 16 85 38 52 12 95]
1000 2628375 3110918 5741979  [13 4 2 19 35 19 38 110 63 207 47 3 10 62 33 36 111 43 35 110]
1000 2592224 3116528 5735334  [4 50 38 12 121 50 30 45 31 78 39 96 19 16 91 92 58 12 78 40]
1000 2594649 3115484 5731133  [100 23 7 13 87 45 41 119 24 139 14 25 41 24 26 60 23 57 106 26]

(no subject)

Date: 2015-01-19 17:28 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
гм, я там оказывается гипертрединг не запретил.

так что дывись:

> cpuset -l 2,3 ./atomic-cs
0000000   7  49  73  58  30  72  44  78  23   9  40  65  92  42  87   3  27  29  40  12 = 880
19362041  54  53  41   1  39  46  52  54  41   5  55  60  51  53  60  24  35  45  69  42 = 880
19368255  33  66  45  54  43   1  37  79  17  30  78  22  55  45  57  54  37  55  43  29 = 880
19326833  25  26  20  22  58  36  18  48  49  47  82  40  40  70  35  28  80  48  40  68 = 880
19340427  46  38  40  47  34  37  55  32  46  55  38  34  78  54  38  38  37  55  33  45 = 880
19364122  51  86  46  24  64  24  87  31   2  91  31  40  43  27  34  20  50  31  36  62 = 880
17873097   0  27  61  61  46  68  75  31  56  38  31  48  44  41  12  42  46  69  38  46 = 880
19462869  29  77  42  54  25  56  37  46  38  25  45  31  18  46  68  10  57  64  40  72 = 880
19477117  13  14  47  63  40  44  45  30  29  63  58  69  58  69  71  17  34  71  31  14 = 880
19331372  28  43  62  45   0  27  84  34  19  63  18  79  68  46  14  61   8  68  71  42 = 880
19788805  42  29  49  56  29  43  50  61  48  21  37  43  43  43  29  29  41  76  69  42 = 880
17981643  32  44  41  45  41  60  33   0  65  60  13  41  29  56  65  23 107  48  45  32 = 880
19441060  16  26  50  44  70  67  23  43  47  87  84  48  45  39  25  26  26  32  32  50 = 880
20962919  44  48  46  49  56  46  21  38  38  54  38  34  17  38 114  40  18  30  54  57 = 880
19465563 108  42  46  70  20  68  67  48  22  48  39  48  36  35  40  36   4  27  43  33 = 880
19475561  48  41  44  51  51  32   0  93  14  93  80  56  52   6   7  24  47  65  52  24 = 880
19477362  26  32  32  45  34  54  30  17  48  71  33  52  53  60  44  56  40  49  49  55 = 880
19475602  38  46  38  57  41  53  67  58   3  45  40  74  51   0  32  40  34  58  56  49 = 880
17929756  67  34  19  70  16  23  71  28  94  12   8  68  39  40  93   0  42  57  70  29 = 880
19477223  37  37  36  44  50  52  38  60  46  36  52  45  45  44  42  36  59  45  48  28 = 880
19480044  71   3  62  30  46  80  49  52  36  23  39  28  26   5  62  33  58  52 106  19 = 880
19474438  11  42  13  28  50  47  81  54  66  43  37  54  24  60  38  29  34  55  74  40 = 880


20M! что гипертрединг животворящий делает!

(no subject)

Date: 2015-01-19 18:47 (UTC)
From: [identity profile] ufm.livejournal.com
Круто. У меня в биосе ht не отключается - так что мне придётся страдать :)

(no subject)

Date: 2015-01-19 19:21 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
не, ты не понял -- 2,3 это два гипертреда одного ядра.

(no subject)

Date: 2015-01-19 16:47 (UTC)
From: [identity profile] ufm.livejournal.com
Всё равно странно.
1000 2450398 2915124 5365522 [26 7 9 8 30 51 70 116 145 16 24 89 27 8 18 107 23 71 0 155]
1000 2447583 2902797 5357951 [53 5 39 40 1 99 77 21 46 72 54 38 75 29 29 39 59 91 111 22]
1000 2429637 2890572 5345370 [58 15 59 17 143 55 136 37 18 22 36 39 15 59 65 31 86 11 7 91]

Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
Single Thread Rating: 2111
Чем посмотреть память под фрёй - я хз.

Причем С на спинлоках - да. Как Go у меня на линуксе:
0000000 83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 26 40 26 72 36 = 1138
8817810 58 58 52 53 58 16 52 69 57 67 59 71 56 80 57 49 64 42 57 63 = 1138
8550864 81 58 70 53 68 16 69 69 45 67 37 71 50 80 47 49 50 42 53 63 = 1138
8706703 47 58 56 53 53 16 50 69 30 67 50 71 76 80 98 49 71 42 39 63 = 1138

А на мутексах - чуть быстрее чем у тебя.
0000000 83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 26 40 26 72 36 = 1138
5689270 61 77 82 46 31 64 61 82 41 58 25 92 45 64 54 64 41 71 17 62 = 1138
5703690 40 77 53 46 70 64 18 82 58 58 37 92 51 64 27 64 58 71 46 62 = 1138
5716883 68 77 33 46 5 64 33 82 60 58 45 92 53 64 79 64 47 71 35 62 = 1138

(no subject)

Date: 2015-01-19 17:03 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
> Чем посмотреть память под фрёй - я хз.

dmidecode
/Memory Device

> Причем С на спинлоках - да. Как Go у меня на линуксе:
> А на мутексах - чуть быстрее чем у тебя.

ну тут опять же, возможно следует вернуться к вопросу об энтропии.
ну и я вот совсем не знаю как и откуда ее go берет.
(у сишной программы следующий алгоритм
        /* Must be in [1, 0x7ffffffe] range at this point. */
        hi = *ctx / 127773;
        lo = *ctx % 127773;
        x = 16807 * lo - 2836 * hi;
        if (x < 0)
                x += 0x7fffffff;
        *ctx = x;
        /* Transform to [0, 0x7ffffffd] range. */
        return (x - 1);

)
я вообще goшную программу не понимаю -- там семь тредов (при четырех-то ядрах), активно выполняются пять (из них три -- очень активно). в среднем тред 50% времени жует сопли.

(no subject)

Date: 2015-01-19 18:22 (UTC)
From: [identity profile] ufm.livejournal.com
Ну семь тредов при 4 ядрах - это небось гипертрединг. :)
Три из них - сама задача.
Еще 4 - скорее всего сам go использует.

(no subject)

Date: 2015-01-19 19:20 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
не, тут гипертрединга нет.
но похоже по этим тредам мигрируют гошные треды.
иначе я не могу объяснить предположить почему больше двух тредов проц жрут

(no subject)

Date: 2015-01-19 17:07 (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
кстати, а спилоки на линукса что кажут?

(no subject)

Date: 2015-01-19 18:13 (UTC)
From: [identity profile] ufm.livejournal.com
У меня сейчас этропии набралось, поэтому вариант на мутексах - 6M, на спинлоках - 7M.