История изменений
Исправление byko3y, (текущая версия) :
На каких задачах тебе не хватило кэша GPU? Мне пока хватает
Проблема не в том, что его «не фатает», а в том, что его по сути нет, большая часть «кэша» тусит в регистрах процессоров, а не в каком-то отдельном быстродействующем хранилище. У тебя на 3080 есть 8700 ядер и 8700 кб L1 кэша:
https://images.nvidia.com/aem-dam/en-zz/Solutions/geforce/ampere/pdf/NVIDIA-a...
То есть, по килобайту на ядро. При том, что регистров по 2 кб на ядро (в два раза больше) — типовая картина для процессора с некогерентным кэшем, которому не нужно координироваться на кэше более высокого уровня и который часто грузит данные из оперативной памяти сразу в регистры, мимо кэшей.
Сравни это с типичным современным десктопным процессором, у которого 1.5 МБ когерентного кэша на ядро.
GDDR6 медленнная? По ср. с чем?
По сравнению с L2/L3 кэшем. Любая оперативная память медленная. Здесь под скоростью я имею в виду именно задержку доступа, а не ширину канала — так-то ширина у GDDR6 составляет сотни гигабайт в секунду. Речь идет, грубо говоря, про сотню циклов на доступ, и чем больше подходов чтения нужно поочередно выполнить, тем меньше будет производительность твоего кода. Отсюда неэффективность косвенного доступа и виртуальных методов.
«Многопоточные коды с ЦП» разные бывают
Основной примитив синхронизации на ЦП — это атомарный compare-and-swap, на котором реализовываются как мутексы, так и lock-free алгоритмы. Всё это не работает на видеокарте, потому что на ней нет когерентного кэша, который бы являлся арбитром при выполнении compare-and-swap. Вместо этого основной механизм синхронизации на GPGPU — барьеры плюс ручное согласование кэша.
Исходная версия byko3y, :
На каких задачах тебе не хватило кэша GPU? Мне пока хватает
Проблема не в том, что его «не фатает», а в том, что его по сути нет, большая часть «кэша» тусит в регистрах процессоров, а не в каком-то отдельном быстродействующем хранилище. У тебя на 3080 есть 8700 ядер и 8700 кб L1 кэша:
https://images.nvidia.com/aem-dam/en-zz/Solutions/geforce/ampere/pdf/NVIDIA-a...
То есть, по килобайту на ядро. При том, что регистров по 2 кб на ядро (в два раза больше) — типовая картина для процессора с некогерентным кэшем, которому не нужно координироваться на кэше более высокого уровня и который часто грузит данные из оперативной памяти сразу в регистры, мимо кэшей.
Сравни это с типичным современным процессором, у которого 1.5 МБ когерентного кэша на ядро.
GDDR6 медленнная? По ср. с чем?
По сравнению с L2/L3 кэшем. Любая оперативная память медленная. Здесь под скоростью я имею в виду именно задержку доступа, а не ширину канала — так-то ширина у GDDR6 составляет сотни гигабайт в секунду. Речь идет, грубо говоря, про сотню циклов на доступ, и чем больше подходов чтения нужно поочередно выполнить, тем меньше будет производительность твоего кода. Отсюда неэффективность косвенного доступа и виртуальных методов.
«Многопоточные коды с ЦП» разные бывают
Основной примитив синхронизации на ЦП — это атомарный compare-and-swap, на котором реализовываются как мутексы, так и lock-free алгоритмы. Всё это не работает на видеокарте, потому что на ней нет когерентного кэша, который бы являлся арбитром при выполнении compare-and-swap. Вместо этого основной механизм синхронизации на GPGPU — барьеры плюс ручное согласование кэша.