NVidia CUDA: кэш L2 и несколько вызовов ядра - PullRequest
2 голосов
/ 09 августа 2011

Мне интересно, освобождается ли кэш L2 между несколькими вызовами ядра.Например, у меня есть ядро, которое выполняет некоторую предварительную обработку данных, и второе, которое использует его.Можно ли добиться большей производительности, если размер данных меньше 768 КБ?Я не вижу смысла в том, чтобы NVidia реализовала это иначе, но, возможно, я ошибаюсьУ кого-нибудь есть такой опыт?

1 Ответ

2 голосов
/ 09 августа 2011

Предположим, вы говорите о кеше данных L2 в Fermi.

Я думаю, что кеши сбрасываются после каждого вызова ядра. По моему опыту, выполнение двух последовательных запусков одного и того же ядра с большим количеством обращений к памяти (и отсутствием кэша # L2) не вносит существенных изменений в статистику кэша L1 / L2.

В вашей проблеме, я думаю, в зависимости от зависимости от данных, можно поместить два этапа в одно ядро ​​(с некоторой синхронизацией), чтобы вторая часть ядра могла повторно использовать данные, обработанные первой частью.

Вот еще одна хитрость: вы знаете, что у gpu есть, например, N SM, вы можете выполнить первую часть, используя первые блоки N * M1. Следующие блоки N * M2 для второй части. Убедитесь, что все блоки в первой части заканчиваются одновременно (или почти) с использованием синхронизации. По моему опыту, порядок планирования блоков действительно детерминирован.

Надеюсь, это поможет.

...