Мне нужно определить как задержку, так и пропускную способность для (беззнакового) модульного умножения в CUDA и на процессоре (i5 750).
Для ЦП я нашел этот документ, стр. 121, для Sandy Bridge я не действительно уверен, к какому из них я должен обратиться, однако для «MUL IMUL r32» я получаю 4 цикла для задержки и обратной пропускной способности, равной 2. Тогда «DIV r64» имеет задержку 30-94 и rec.thr. 22-76.
Худший вариант развития событий:
задержка 94+4
рек.тр. 76+2
Верно? Хотя я использую OpenSSL для их выполнения, я почти уверен, что на самом низком уровне они всегда выполняют простые модульные умножения.
Что касается CUDA, в настоящее время я выполняю модульное умножение в PTX: умножаю 2 числа 32b, сохраняю результат в регистре 64b, загружаю 32b по модулю в регистр 64b, а затем выполняю 64b по модулю.
Если посмотреть здесь, стр. 76, то говорят пропускная способность на Fermi 2.x для 32b целочисленное умножение равно 16 (за такт на MP). По модулю просто говорят: "менее 20 инструкций на устройствах с вычислительной мощностью 2.x"...
что это значит? В худшем случае 20 циклов по модулю на MP задержки? А пропускная способность? Сколько модулей на MP?
Редактировать:
А что, если у меня есть варп, где только первые 16 потоков варпа должны выполнять умножение 32b (16 единиц за такт на MP). Будет ли GPU занят на один или два такта, хотя вторую половину ему делать нечего?