Здравствуйте, BulatZiganshin, Вы писали:
BZ>1024 псевдопотока — это 32 реальных потока. вот их и приходится синхронизировать. а в целом titan x с его 24 smx может выполнять порядка 1000 (24*4*10) потоков одновременно, т.е. 30 тыщ скалярных псевдопотоков
Кстати о потоках. Теперь меня интересует, как избавиться от atomic, причем избавиться так, чтоб было быстрее чем текущий код с shared memory. Вижу одну лазейку небольшую, если бы ведер было 32, учитывая что потоки группируются как SIMD инструкции по 32, то на этапе обращений к shared memory уже никакие атомик были бы не нужны. Вернее можно было бы shared memory разбить на блоки по 32 элемента, и все нити, которые выполняются как SIMD инструкции, писали бы в свой блок. А при завершении уже агрегировать с глобальной памятью с помощью атомиков.
Но проблема в том, что ведер больше чем 32. Если их предварительно сортировать, можно было бы что сделать, но чтоб сортировать — нужна память. Выделение памяти занимает черти сколько времени, сразу получается в 20 раз медленнее только на одном выделении памяти. Есть идея не пытаться параллельно весь буфер обработать, а последовательно вызывать kernels из основного кода — тоже получается очень медленно.
В статье, которую я приводил, вроде говорилось про избавление от атомиков. Правда ни черта не понял как, и я не уверен что там возможно устранить вообще все атомики.