Я використовую CUDA вже кілька тижнів, але у мене є сумніви щодо розподілу блоків / деформацій / ниток. Я вивчаю архітектуру з дидактичної точки зору (університетський проект), тому досягнення пікових показників не викликає мого занепокоєння.
Перш за все, я хотів би зрозуміти, чи зрозуміли я ці факти:
Програміст пише ядро і організовує його виконання в сітці ниткових блоків.
Кожен блок присвоюється потоковому багатопроцесору (SM). Після призначення він не може перейти на інший SM.
Кожен SM розбиває власні блоки на Warps (наразі з максимальним розміром 32 нитки). Усі потоки в warp виконуються одночасно на ресурсах SM.
Фактичне виконання потоку виконується ядрами CUDA, що містяться в SM. Немає конкретного відображення між нитками та ядрами.
Якщо основи містять 20 ниток, але в даний час доступно лише 16 ядер, основи не запускаються.
З іншого боку, якщо блок містить 48 потоків, він буде розділений на 2 основи, і вони будуть виконуватися паралельно за умови наявності достатньої кількості пам'яті.
Якщо потік починається на ядрі, він зупиняється для доступу до пам'яті або для тривалої операції з плаваючою точкою, його виконання може відновитись на іншому ядрі.
Чи правильно вони?
Тепер у мене є GeForce 560 Ti, тому згідно специфікацій він оснащений 8 SM, кожне з яких містить 48 ядер CUDA (384 ядра в цілому).
Моя мета - переконатися, що кожне ядро архітектури виконує інструкції SAME. Припускаючи, що мій код не потребуватиме більше реєстру, ніж доступний у кожній SM, я уявляв різні підходи:
Я створюю 8 блоків з 48 потоків кожен, так що кожен SM має 1 блок для виконання. У цьому випадку 48 потоків будуть виконуватися паралельно в SM (експлуатуючи всі 48 доступних для них ядер)?
Чи є якась різниця, якщо я запускаю 64 блоки з 6 потоків? (Якщо припустити, що вони будуть відображені рівномірно серед SMS)
Якщо я "занурюю" графічний процесор у заплановані роботи (створюючи, наприклад, 1024 блоки з 1024 потоку кожного), розумно припустити, що всі ядра будуть використовуватися в певний момент і будуть виконувати однакові обчислення (припускаючи, що потоки ніколи не затримуються)?
Чи є можливість перевірити ці ситуації за допомогою профілера?
Чи є посилання на цей матеріал? Я читав посібник із програмування CUDA та глави, присвячені архітектурі апаратних засобів у "Програмуванні масивно паралельних процесорів" та "Проектуванні та розробці програм CUDA"; але я не зміг отримати точної відповіді.