Хорошо, я знаю, что связанные вопросы задавались снова и снова, и я читал почти все, что я нашел об этом, но все еще неясно. Вероятно, потому, что я нашел и прочитал вещи, противоречащие друг другу (возможно, потому, что, будучи в разное время, они ссылались на устройства с разной вычислительной способностью, между которыми, кажется, был довольно разрыв). Я стараюсь быть более эффективным, чтобы сократить время выполнения, и поэтому мне нужно точно знать, сколько потоков/перекосов/блоков может выполняться одновременно параллельно. Также я думал об обобщении этого и вычислении оптимального количества потоков и блоков для передачи на мое ядро, основываясь только на количестве операций, которые, как я знаю, мне нужно делать (для более простых программ) и системных спецификациях.
У меня есть GTX 550Ti, btw с вычислительной способностью 2.1. 4 SMs x 48 ядер = 192 ядра CUDA.
Хорошо, так что мне непонятно:
Можно выполнить более одного блока AT ONCE (параллельно) на мультипроцессоре (SM)? Я читал, что до 8 блоков можно назначить SM, но ничего не известно о том, как они запускаются. Из-за того, что мое максимальное количество потоков на SM (1536) едва больше моего максимального количества потоков на блок (1024), я думаю, что блоки не запускаются параллельно (может быть, полторы?). Или, по крайней мере, нет, если у меня есть максимальное количество потоков на них. Также, если я задаю количество блоков, скажем, 4 (мое число SM), они будут отправляться на другой SM каждый? Или я не могу реально контролировать, как все это распространяется на аппаратное обеспечение, а затем это спорный вопрос, мое время выполнения зависит от капризов моего устройства...
Во-вторых, я знаю, что блок будет делить потоки на группы из 32 потоков, которые работают параллельно, называемые перекосами. Теперь эти перекосы (предполагающие, что они не имеют никакого отношения друг к другу) могут быть запущены параллельно? Поскольку в архитектуре Fermi указано, что 2 искажения выполняются одновременно, отправка одной инструкции из каждого warp в группу из 16 (?) Ядер, а где-то еще я читаю, что каждое ядро обрабатывает warp, что объясняет максимальные потоки 1536 ( 32 * 48), но кажется немного. Может ли 1 CUDA-ядро обрабатывать 32 потока одновременно?
В более простой заметке, я прошу: (например, если я хочу суммировать 2 вектора в третьем, какую длину я должен им дать (nr операций) и как их разделить на блоки и потоки для моего устройства работать одновременно (параллельно) на полную мощность (без наличия простаивающих ядер или SM).
Прошу прощения, если это было задано раньше, и я не понял его или не видел. Надеюсь, ты поможешь мне. Спасибо!