1. C++ / Говнокод #13484

    +8

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    #include <pthread.h>
    template<class T = long long>
    class AtomicCounter
    {
        public:
            explicit AtomicCounter( T value = 0 ): _count( value ) { pthread_spin_init( &_lock, PTHREAD_PROCESS_PRIVATE );};
            ~AtomicCounter()  { pthread_spin_destroy( &_lock );    };
    
            T operator++(int) volatile {  return interlockFetchAndAdd( 1 );      };
            T operator--(int) volatile {  return interlockFetchAndAdd( -1 );     };
            T operator() ()   volatile {  return interlockFetchAndAdd( 0 );      }
    
        private:
            volatile T    _count;
            pthread_spinlock_t _lock;
    
            T interlockFetchAndAdd( int delta ) volatile
            {
                T x = 0;
                pthread_spin_lock( &_lock );
                x = _count;
                _count += delta;
                pthread_spin_unlock(&_lock);
                return x;
            }
    };

    Принцип наименьшего удивления, говорите

    Запостил: roman-kashitsyn, 26 Июля 2013

    Комментарии (51) RSS

    • ГК в том, что здесь operator () вместо operator T?
      Ответить
    • Блин, пилить атомики через спинлок это конечно очень эффективно.
      Ответить
      • А в чем разница с CAS на значении до тех пор пока не пройдет? Тот же спинлок.
        Хотя чувствуется что-то тут не так.
        Ответить
        • > в чем разница с CAS
          По идее ни в чем. У захвата спинлока и цаса должна быть почти одинаковая производительность. Но здесь есть и тонкость - для реализации атомарного инкремента на 32 битке для sizeof(T) == 4 и на 64 битке для sizeof(T) == 8 цас не нужен, достаточно xadd.

          Поэтому, имхо, стоит юзать готовые атомики, оптимизнутые под разные платформы, а не городить свой велосипед...
          Ответить
          • > цас не нужен, достаточно xadd.

            какой шустрый. не забываем префикс "lock". без лока на разных корках одного проца может работать и будет - но на разных процах и/или разных numa нодах уже не гарантируется.

            > Поэтому, имхо, стоит юзать готовые атомики, оптимизнутые под разные платформы, а не городить свой велосипед...

            их нужно юзать именно по тому что синхрониция штука нетривиальная и платформенно-специфична (и на безграмотной "проц == платформа" далеко не укатишь).

            и атомарность делать на спинлоках это что по воробьям из пушки: почти все процы уже достаточно давно поддерживают атомарные операции.
            Ответить
            • Что меня в свое время убило, так что, что даже инструкции процессора вроде inc могут быть не атомарными.
              Ответить
              • Что меня до сих пор убивает, что почти никто не понимает что память есть *внешнее* устройство. Со всеми вытекающими.
                Ответить
                • Что меня убивает, так то, что есть люди, которые не понимают, что есть прикладные программисты, ниже VM языка не заглядывавшие.
                  Ответить
            • > не забываем префикс "lock"
              Ок, забыл про него написать. Но xadd хоть с lock хоть без lock это ни в коем случае не CAS. CAS'ы это cmpxchg и его большой брат.
              Ответить
              • А в чем разница между cas-вариантом и fetch-вариантом? lock xadd как я понимаю это фетч
                Ответить
                • cmpxchg - compare-and-swap. Для реализации атомика используется так - загружаем старое значение, изменяем как надо, и пытаемся сделать cas. Если он сфейлился (сброшен флаг zf) - значит пробуем еще раз с самого начала (загрузки старого значения). И так пока не прокатит. Более универсален, чем xadd, например на его основе можно запиливать списки и очереди. В адекватных ситуациях (если не дрочить его непрерывно кучей процов) достаточно эффективен и прокатывает с 1-2 раза. Но при неаккуратном использовании можно словить ABA проблему.

                  lock xadd - fetch-and-add. Собственно настоящий атомарный инкремент - возвращает старое значение ячейки и увеличивает ее на заданное число. Всегда прокатывает с первого раза.
                  Ответить
                  • >>Но при неаккуратном использовании можно словить ABA проблему.
                    Да там куча проблем.

                    >>на его основе можно запиливать списки и очереди
                    Что само по себе нетривиальная алгоритмическая задача. Надо еще доказать что твой алгоритм корректно работает. Потому интел и запилила в новые процы TSX. Удобство написания как с лочками, а скорость как с CAS.
                    Кстати а куда из сишко/кресто тредов пропали все школьники, и питушыный царь в частности?
                    Ответить
                    • TSX? Фондовая биржа Торонто?
                      Ответить
                      • ?q=intel+tsx
                        Ответить
                        • Нихрена себе. Неужели они кроме STM (software transactional memory) запилили HTM?
                          Ответить
                          • >> запилили HTM
                            Не похоже. Там STM и это уже круто.

                            Нравится то что интел не увеличивает тупо количество ядер (хотя при текущий транзисторный и тепловой бюджет смело позволяют делать 8-ядерники, если выкинуть нахер видеоядро, то по цене выйдет так же), но и пытается облегчить программистам использование этих самых ядер.
                            Ибо сейчас многопоточность, это вам не AssParallel написать.
                            Ответить
                            • А интеловцы все-таки пидорасы - на разгоняемых хасвелах с индексом К порезали виртуализацию и этот самый TSX. А на остальных порезали разгон ;)
                              Ответить
                              • Да, есть у них такие странные приколы: амд разлочено но не гонится, потому что горячее, интел холодное и гонится, но залочено.

                                Раньше как-то проще с этим было: обычно процессор в среднем за 75$ (в разное время по разному от 50 [Duron 1400 был который разлочивался в атлон] до 100$) можно было разогнать до скорости старшей модели и выше и перекрыть с лихвой недостаток кеша. Сейчас так нельзя - ядра не добавишь. Приходится брать за 200$.

                                Да и раньше они наоборот делали. На дешевых виртуализацию резали.
                                Но я всё-равно K не собирался брать.
                                Ответить
                                • > не собирался брать
                                  т.к. дешевле выйдет, а задач не стоит?
                                  Ответить
                                • > Но я всё-равно K не собирался брать.
                                  К в нашем бобруйске стоит рублей на 300-500 дороже, чем не К. Поэтому смысл брать не К? Ну вот разве за порезанную виртуализацию обидно.

                                  UPD: Упс, ошибся, посмотрел на и5 ;) А и7 с индексом К стоят на 1000-1300 дороже.
                                  Ответить
                                  • ты многого не учел
                                    брать K = не только переплатить 1000р, но и взять соответствующую плату под него (Z87 = 200$+) + нормальный кулер (nh-d14 = 100$)

                                    ps - ну и нормальный надёжный БП, да
                                    Ответить
                                    • Ну это да, согласен. Хотя нормальный кулер и хороший бп к своему новенькомуиви брайдж и5 я все равно взял. В основном ради тишины.

                                      Ну и да, под хасвелл материнки действительно пока дороги. Даже не на разгонных чипсетах zXX.
                                      Ответить
                                      • они всегда будут дороги

                                        #прямосейчас моя материнка под санди на newegg стоит 179$, а два поколения уже минуло
                                        Ответить
                                    • >соответствующую плату под него + нормальный кулер
                                      Угу. Всё-равно они при разгоне до 5 становятся шибко горячие. Смысла нету. У меня стойкая привычка, еще с тех времен когда денег на железо не хватало никогда не покупать топовое - быстро устаревает. Лоченые можно поднять до 3.5-4 это ненамного хуже.

                                      Если только не любитель поразгонять ради разгона.

                                      Удивляет другое. Зачем интел сделала версию 128 метрами L4 (у меня когда-то оперативы было меньше и всё летало) и продает только для ультрамобильных процов.
                                      Полагаю в десктопе был бы определенный спрос.
                                      Ответить
                                      • > быстро устаревает
                                        с блядским интелом и санди бридж всё ещё актуален
                                        > шибко горячие
                                        всё зависит от СО

                                        я вот домой подумываю об 2х http://bit.ly/14stzJ8
                                        Ответить
                                        • По мне - всё правильно они делают. 10 миллиардов выручки подтверждают это.
                                          Это не бляский интел виноват, а амд - не могут догнать и сделать конкуретный проц. Потому все хейтеры "амд-маст-дай интел форева" за что боролись, на то и напоролись.

                                          >всё зависит от СО
                                          Какой смысл дрочится чтоб добавить 20% скорости итак шустрому камню? Куда это девать? Собирать крестопроекты? Компилить генту?
                                          Тарас смотрит на нас с презрением.

                                          Мне новые ядра интересны исключительно упомянутым TSX, наборами инструкций и отличным power-managment => низким энергопотреблением.
                                          Ответить
                                          • на (уже старой) работе - собирать крестопроекты
                                            дома - да хоть тот же лайтрум
                                            были бы ресурсы, а куда их деть всегда найдется

                                            низкое энергопотребление нужно ноутбукам для автономности, ну и чтобы яйца не жарить, а компу плюс минус 50 ватт - да пофиг

                                            а дрочиться не надо, не знаю откуда эта байка про сложность разгона
                                            потратишь час на подбор стабильных максимальных границ, и оно работает потом годами и особого обслуживания не требует (ну если воздушное охлаждение - то надо иногда пылесосить, да)
                                            Ответить
                                            • Людям вечно чего-то не хватает.
                                              Уже и 4-х ядерники вышли, а счастья все нет.
                                              Относитесь к этому проще, вот как Тарас - философски. Если что-то тупит - это в первую очередь означает делаю что-то не так. И только потом думать о железе.

                                              20% разгон не сделает жизнь проще и быстрее. Профит от алгоритмических улучшений составляет разы или десятки раз.
                                              >лайтрум
                                              Вот, например, говнофирма адобе. Её продукты надо запретить на законодательном уровне.
                                              Ответить
                                      • > интел сделала версию 128 метрами L4
                                        Зачем, если это обычная DRAM?
                                        Ответить
                                        • >если это обычная DRAM?
                                          Необычная, а на кристалле и в несколько раз быстрее DDR-3, как и положено кешу.

                                          >потратишь час на подбор стабильных максимальных границ
                                          Ага. Час. А поднятия напряжения? А перезагрузуки? А то что prime95 или linpack может упасть через сутки.

                                          Дело не в сложности разгона. Зачем мудохаться - покупать кулер, K-версию, искать материнку, и иметь печку в корпусе, ради лишних 10-15%?

                                          Если б 50%-70%, как в былые времена то я бы понял.
                                          Ответить
                                          • хочется гонять стресс-тесты сутками? - мне нет
                                            я написал реальные цифры
                                            перезагрузка (если уж так получилось) займет копейки - уефи биос + нормальный хард под винду (например, ссд - но меня тогда жаба задавила и я сделал всего лишь рейд-0)
                                            сейчас вообще ПО есть из-под винды с ползунками, не надо в биосе красноглазить

                                            печка в корпусе - это ж не сервер, ей-богу, 90% времени цпу работает как и положено - 1.6ГГц, и поэтому потребляет 25Вт
                                            зато когда надо - крестокомпиляция занимает на 25% меньше

                                            и да, при стресс-тесте linx из верхней крышки корпуса выдувается еле теплый ветерок
                                            при окончании 100% нагрузки температура _мгновенно_ падает до стандартной 35°
                                            а кулер не слышно в обоих режимах

                                            блин, о вкусе устриц стоит спорить только с тем, кто их ел...
                                            Ответить
                                            • Смотря как... Можно вот видео сутками энкодить или днями играть в игры.
                                              И тогда это ощутимо. В комнате где ищещь прохлады от летней погоды становится жарко.

                                              >хочется гонять стресс-тесты сутками? - мне нет
                                              Если гонять стресс-тест 10 минут, тогда есть риск получить нестабильное железо - это хуже, хуже всего в общем. У меня был случай когда процессор со временем уменьшал свой частотный потолок. И после джвух лет переставал проходить стресс-тесты на стабильной ранее частоте.
                                              Ответить
                                              • видео енкодить - разве это не скалируется от частоты?
                                                20% от суток - часа 4, не меньше
                                                Ответить
                                                • >20% от суток
                                                  А тепловыделение растет пропорционально частоте * квадрат напряжения. Холодные интеловские процы превращаются в 120 ваттные печки. Рост энергопотребления 50-60%.

                                                  То есть чем ближе к потолку тем больше расчет ватт/гц.

                                                  Лучше купить два дешевых НЕ K проца и материнки с боксовым кулером и ускорится в 2 раза.
                                                  Ответить
                                                  • >ускорится
                                                    ускориться
                                                    Ответить
                                                  • два не к проца = два корпуса, два бп, две материнки, два харда
                                                    навскидку - ну, допустим +10к рублей за сетап (лень считать...)
                                                    потребление +100 ватт = 3,15р/квт-ч * 0.1 квт * 24 часа = 8 рублей в сутки = 3000р в год

                                                    что там, кстати, современные видюхи видео не помогают кодировать?
                                                    (нескромный вопрос - это хобби? или ты и есть тот самый добрый самаритянин, что заботливо рипает блюреи на рутрекер для меня?)
                                                    Ответить
                                                    • А кстати уже hevc вышел.
                                                      Совсем скоро рипы блюреев будут в джва-три раза меньше.
                                                      Но злобные модерасты опять будут ставить палки в колеса как было с AVC. Кстати интересно было бы услышать что по этому поводу думает Мицгол.

                                                      > современные видюхи видео не помогают кодировать?
                                                      Это несбыточная мечта и популярная тема у маркетологов. Кодеки быстрые, да. Но какчество у них очень плохое. У интела самая лучшая реализация, очень-очень быстро, и качественней остальных подобных творений.
                                                      Но сжимает хуже того же x264 --fast, где-то на уровне xVid. Рипы на рутрекерах жмутся гораздо более сильными настройками.
                                                      В прошлом году сделали opencl патч, но он во-первых нестабильный, во-вторых, он частенько случаях замедляет работу - слишком большие задержки передать работу в карту и забрать обратно результат. Профит от него около 10%.

                                                      Потому что крайне сложно написать такой многопоточный код, который будет синхронно считать кусок работы на GPU и успевать вовремя подавать в CPU.

                                                      Тут кстати и помогает пресловутый L4 - видуха и проц обмениваюся через него, а не медленную память.

                                                      А амд пилит чудо-технологию NUMA - то есть память карты и основная будут в одном адресном пространстве - что теоретически должно помочь при кодинге таких вот алгоритмов.
                                                      Ответить
                                          • > Необычная, а на кристалле и в несколько раз быстрее DDR-3
                                            Она быстрее просто из-за того, что на кристале.
                                            В несколько раз быстрее - это детский сад.
                                            Ответить
                              • Не зря их [процессоры Intel] Касперски парафинилъ.
                                Ответить
                                • Он на них наехал?
                                  Ответить
                                  • Ну, нельзя сказать, что прямо таки, наехал, просто в своих трудах примерно 2-3-х летней давности он утверждал, что интеловская "бижутерия" позволяет выполнять переполнение буфера; куда мол, они смотрят.
                                    Ответить
                          • >запилили HTM
                            hierarchical temporal memory?
                            Если имелась ввиду Hardware transactional memory, то да.
                            Ответить

    Добавить комментарий