Отношение между CPI и количеством исполнительных устройств при взгляде на встроенные функции SIMD

Я понимаю, что термин « цикл на инструкцию» тесно связан с суперскалярностью процессора, термин, который я не полностью понял. Согласно Википедии, «... суперскалярный процессор может выполнять более одной инструкции в течение тактового цикла, одновременно отправляя несколько инструкций на разные исполнительные блоки процессора». В той же статье есть намек на то, что суперскалярность не обязательно связана с конвейерной обработкой команд — концепцией, с которой я хорошо знаком.

Теперь давайте конкретизируем на примере , который, согласно https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#avxnewtechs=AVX,AVX2,FMA , имеет CPI 0,5 для микроархитектуры Alder Lake .

Вопросы:

  1. Могу ли я предположить, что во всех чипах Alder Lake исполняются ровно 2 одинаковых исполнительных блока ?
  2. Как программист может узнать, какие отдельные инструкции включают одни и те же единицы выполнения?
  3. Если имеется разное количество исполнительных блоков для разных инструкций (например,_mm256_shuffle_ps), какой смысл имеет утверждение «X является 4-процессорным суперскалярным процессором», учитывая, что ни одно число не может описать различные множественности каждого исполнительного блока?

Заранее спасибо за передачу знаний.

1 ответ

Термин суперскаляр обычно применяется к старым процессорам, например, к оригинальному Pentium. В те дни у вас было два отдельных канала, U (первичный) и V (вторичный), которые потенциально позволяли вам отправлять две инструкции одновременно (т.е. у него было 2 исполнительных блока) . По сути, это был способ получить немного лучшую производительность от ядра процессора в порядке (хотя это сопровождалось оговорками — например, проблемой могли быть пузыри конвейера)

В наши дни процессоры, как правило, используют внеочередное выполнение (OOOE), поддерживаемое большим количеством исполнительных блоков. ЦП Alder Lake имеет 12 исполнительных блоков, однако эти исполнительные блоки, как правило, в некоторой степени специализированы — например, загрузка/сохранение, арифметика указателей, модули SIMD FPU и т. д. Вот почему вы не увидите 12 исполнительных блоков, способных выполнять тасование. Он может отправлять 12 микроопераций за цикл, но все эти операции не могут быть одной и той же инструкцией.

Могу ли я предположить, что во всех чипах Alder Lake есть ровно 2 одинаковых исполнительных блока, выполняющих _mm256_shuffle_ps?

Нет, ты не можешь этого предположить. Можно предположить, что есть два исполнительных блока , способных выполнять , но это не означает, что эти две единицы идентичны. Например, мы можем видеть, что есть 3 исполнительных блока, которые могут работать с 256-битными регистрами YMM, и мы можем видеть по таймингам инструкций, что все 3 могут выполнять. Тем не менее, только 2 могут выполнять, и только 1 может выполнить, так что они явно не одинаковы....

Как программист может узнать, какие отдельные инструкции включают одни и те же единицы выполнения?

Если производитель явно не указывает возможности каждого исполнительного порта (иногда вы найдете эту информацию в техническом руководстве для ЦП) , вы в значительной степени ограничены в том, чтобы делать обоснованные предположения (например, Apple M1)

Если для разных инструкций (таких как _mm256_shuffle_ps) имеется разное количество исполнительных блоков, то какой смысл имеет утверждение «X — четырехпроцессорный суперскалярный процессор», если ни одно число не может описать различные множественности каждого исполнительного блока?

Современные процессоры Intel не являются суперскалярами, поэтому описывать их как таковые вообще не имеет смысла.

Alder Lake может отправлять 12 инструкций за такт, используя Out-Of-Order-Execution. Типы инструкций, которые могут обрабатывать исполнительные блоки, обычно ориентированы на ряд распространенных случаев. Например, рассмотрим этот код:

      void func(float* r, float* a, float* b) {

   // basic integer ops: increment and less-than
   for(int i = 0; i < 128; ++i) {

      // 2 address manipulation instructions
      float* addr_a = a + i * 4;
      float* addr_b = b + i * 4;

      // 2 load instructions
      __m128 A = _mm_load_ps(addr_a);
      __m128 B = _mm_load_ps(addr_b);

      // an addition
      __m128 R = _mm_add_ps(A, B);

      // another address manipulation op
      float* addr_r = r + i * 4;

      // a store instruction
      _mm_store_ps(addr_r, R);
   }
}

Предоставление 12 исполнительных блоков, каждый из которых способен выполнятьинструкция не имеет особого смысла. Имеет больше смысла сбалансировать количество исполнительных модулей SIMD со всеми этими обычными задачами (например, манипуляцией адресами, циклами и т. д.) .

Другие вопросы по тегам