Масштабируемость на GPU должна измеряться не с точки зрения ядер CUDA, а с точки зрения использования SM.IPC, вероятно, лучшая единица измерения использования SM.При разработке алгоритма вы хотите разделить свою работу таким образом, чтобы вы могли распределить достаточное количество работы среди всех SM, чтобы в каждом цикле планировщик деформаций имел хотя бы одну деформацию, подходящую для выпуска и инструкции.В целом это означает, что у вас должно быть достаточно перекосов на каждом SM, чтобы скрыть задержки команд и памяти и предоставить различные типы команд для заполнения конвейера выполнения.
Если вы хотите протестировать масштабирование по ядрам CUDA (бессмысленно) затем вы можете запускать блоки потоков, содержащие 1, 2, 3, ... 32 потока на блок.Запуск не кратных потоков WARP_SIZE (= 32) на блок потоков приведет к использованию только подмножества ядер.В основном это бесполезные слоты выполнения.
Если вы хотите протестировать масштабирование с точки зрения SM, вы можете масштабировать свой алгоритм от 1-го блока до 1000-х блоков потоков.Чтобы понять масштабирование, вы можете искусственно ограничить блоки потоков на SM, настроив разделяемую память на блок потоков при запуске.
Перезапись матрицы умножения для оптимального масштабирования в каждом из этих направлений, вероятно, будет разочаровывающей,Перед тем, как приступить к этому проекту, я бы порекомендовал понять, как распределить простые параллельные вычисления, такие как суммирование от 0 до 100000 или вычисление факториальных масштабов по многопоточным блокам.Эти алгоритмы представляют собой всего несколько строк кода, и вышеупомянутое масштабирование можно попробовать, варьируя конфигурацию запуска (GridDim, BlockDim, SharedMemoryPerBlock) и параметры ядра 1-2. Вы можете рассчитывать время различных запусков, используя профилировщик CUDA, Visual Profiler, Parallel Nsightили CUevents.