Интересно, это я «не умею их готовить», или с 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 14:28 (UTC)(no subject)
Date: 2015-01-19 14:33 (UTC)Кстати, если я тебе голаговый бинарник дам - запустишь для сравнения?
(no subject)
Date: 2015-01-19 14:38 (UTC)ну очевидно же, что тут имеется а) lock congestion б) вероятно в твоем случае дополнительно энтропия кончается (тут разница фря vs линух?)
во втором варианте тупо s/pthread_mutex/pthread_spinlock/ -- это с очевидностью следует из а)
(no subject)
Date: 2015-01-19 14:41 (UTC)А вот, кстати, с энтропией - это идея.
(no subject)
Date: 2015-01-19 14:45 (UTC)сейчас -- под 9.2 или 10.1 (но это указывай отдельно -- мне надо будет дома запускать, а так тачки одинаковые, может только память разная)
(no subject)
Date: 2015-01-19 15:48 (UTC)Оно статикой слинковано - так что должно на всём что шевелится запускаться. У меня на 10-0 запустилось.
(no subject)
Date: 2015-01-19 15:53 (UTC)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)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)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)(no subject)
Date: 2015-01-19 16:40 (UTC)(no subject)
Date: 2015-01-19 16:55 (UTC)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)(а что такое 50 50 50 50? я вообще в программу не вникал)
возможно дольше надо погонять
я про ноль во второй колонке (хотя я и не знаю что он должен означать, но глаз режет)
(no subject)
Date: 2015-01-19 18:11 (UTC)Есть массив.
Есть три треда.
Первый - берет два значения из массива и методом отнимания от одного и прибавления другому - старается выравнять все значения.
Второй - вносит хаос. Т.е. берет сколько нибудь у одного значения и присваевает другому.
Третий - время от времени показывает текущее состояние этого массива.
0 во втором столбце - это значит за секунду отработало 0 циклов хаоса (из-за этого-же "50 50 50 ..." - оно успело выровнять все значения). Т.е. без ввода/вывода, без работы с каналами (я не помню когда еще в go шедулер треды переключает, но эти две причины - точно) и на одном ядре зелёные треды у GO достаточно фигово переключаются.
(no subject)
Date: 2015-01-19 17:17 (UTC)CPU: Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz (3392.37-MHz K8-class CPU)
DDR3 1600, емнип.
(no subject)
Date: 2015-01-19 17:28 (UTC)так что дывись:
20M! что гипертрединг животворящий делает!
(no subject)
Date: 2015-01-19 18:47 (UTC)(no subject)
Date: 2015-01-19 19:21 (UTC)(no subject)
Date: 2015-01-19 16:47 (UTC)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)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)Три из них - сама задача.
Еще 4 - скорее всего сам go использует.
(no subject)
Date: 2015-01-19 19:20 (UTC)но похоже по этим тредам мигрируют гошные треды.
иначе я не могу объяснить предположить почему больше двух тредов проц жрут
(no subject)
Date: 2015-01-19 17:07 (UTC)(no subject)
Date: 2015-01-19 18:13 (UTC)