использование общей памяти

Работаю над data-bounded программкой, в каждом потоке которой создается и используется много раз матрица double размером 16 * 16.
Изначально эту матрицу я клал в локальную память - самый простой способ. Но из за того что каждое обращение к ней стоит 400-600 тиков, решил попробовать общую память. Так как таких матриц в общую влезает всего 7, и часть матрицы используется более интенсивно чем другая, то засунул более интенсивно используемую часть матрицы в общую память, хватило места на 16 потоков. Плюс одна строка матрицы читается из константной памяти так как в нее ничего не пишется в процессе. В итоге сократил использование локальной памяти в разы. Но такая программа показала значительное замедление по сравнению с той что использует локальную память, даже несмотря на то что я исключил возможность bank conflicts, о чем свидетельствуют показания профайлера.

Результаты:
с локальной памятью решает 2048 элементов в 16 потоков за 4 секунды (оптимальнее 64 потока, я для сравнения привожу).
с общей памятью решает 128 элементов в 16 потоков за 4 секунды.

Может кто нибудь может подсказать с чем это может быть связано? Неужели такое замедление может быть вызвано дополнительными операциями по подсчету индексов и разложению double??? (Что кстати не принесло ни ускорения ни замедления, то есть что без разложения и с 22 миллионами bank conflicts, что с разложением и 0 bank conflicts - одно время решения.)

Forums: