Re[10]: А как бы еще и от atomic избавиться
От: elmal  
Дата: 13.10.15 08:21
Оценка:
Здравствуйте, 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 из основного кода — тоже получается очень медленно.

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