игра брюс 2048
Главная / Программирование / Введение в принципы функционирования и применения современных мультиядерных архитектур (на примере Intel Xeon Phi) / Тест 4

Введение в принципы функционирования и применения современных мультиядерных архитектур (на примере Intel Xeon Phi) - тест 4

Упражнение 1:
Номер 1
Подход, основанный на организации вычислений с использованием команд SIMD (SSE, SSE2, etc.), называется:

Ответ:

 (1) интерполяция 

 (2) модуляция 

 (3) векторизация 

 (4) комбинация 


Номер 2
Суть парадигмы SIMD заключается в следующем:

Ответ:

 (1) одновременное выполнение операции над разными данными 

 (2) одновременное выполнение разных операций над одними и теми же данными 

 (3) одновременное выполнение разных операций над разными данными 

 (4) многократное выполнение одинаковых операций над одними и теми же данными 


Номер 3
Пусть в программе присутствует следующий код:#define LOOP_SIZE 16
…
int rr[LOOP_SIZE];
…
p = 1;
for(int k = 0; k < LOOP_SIZE; k++)
{
  p *= rr[k];
}
Какого следует ожидать ускорения в результате векторизации по сравнению со скалярной версией на Intel Xeon Phi?

Ответ:

 (1) <16 

 (2) 16 

 (3) >16 

 (4)


Номер 4
Пусть в программе присутствует следующий код:#define LOOP_SIZE 24
…
int rr[LOOP_SIZE];
…
p = 1;
for(int k = 0; k < LOOP_SIZE; k++)
{
  p *= rr[k];
}
Какого следует ожидать ускорения в результате векторизации по сравнению со скалярной версией на Intel Xeon Phi?

Ответ:

 (1) <12  

 (2) 16 

 (3) >12 

 (4)


Номер 5
Пусть в программе присутствует следующий код:#define LOOP_SIZE 24
…
int rr[LOOP_SIZE];
for(int k = 0; k < LOOP_SIZE; k++)
{
  rr[k] = number % k;
}
Какого следует ожидать ускорения в результате векторизации по сравнению со скалярной версией на Intel Xeon Phi?

Ответ:

 (1) <12  

 (2) 16 

 (3) >12 

 (4)


Упражнение 2:
Номер 1
Размер векторного регистра для хранения данных с плавающей запятой в наборах команд SSE составляет:

Ответ:

 (1) 64 байт 

 (2) 32 байт 

 (3) 16 байт 

 (4) 8 байт 


Номер 2
Размер векторного регистра для хранения данных с плавающей запятой в наборе команд AVX составляет:

Ответ:

 (1) 64 байт 

 (2) 32 байт 

 (3) 16 байт 

 (4) 8 байт 


Номер 3
Размер векторного регистра для хранения данных с плавающей запятой в наборе команд Intel Xeon Phi составляет:

Ответ:

 (1) 64 байт 

 (2) 32 байт 

 (3) 16 байт 

 (4) 8 байт 


Упражнение 3:
Номер 1
Какого потенциального ускорения можно добиться при векторизации функции, работающей с вещественными числами одинарной точности, с использованием расширения SSE на процессоре Intel Xeon

Ответ:

 (1) 8 раз 

 (2) 2 раза 

 (3) 4 раза 

 (4) 16 раз 


Номер 2
Какого потенциального ускорения можно добиться при векторизации функции, работающей с вещественными числами одинарной точности, с использованием расширения AVX на процессоре Intel Xeon

Ответ:

 (1) 8 раз 

 (2) 2 раза 

 (3) 4 раза 

 (4) 16 раз 


Номер 3
Какого потенциального ускорения можно добиться при векторизации функции, работающей с вещественными числами одинарной точности, на сопроцессоре Intel Xeon Phi

Ответ:

 (1) 8 раз 

 (2) 2 раза 

 (3) 4 раза 

 (4) 16 раз 


Упражнение 4:
Номер 1
Какого потенциального ускорения можно добиться при векторизации функции, работающей с вещественными числами двойной точности, с использованием расширения SSE на процессоре Intel Xeon

Ответ:

 (1) 8 раз 

 (2) 2 раза 

 (3) 4 раза 

 (4) 16 раз 


Номер 2
Какого потенциального ускорения можно добиться при векторизации функции, работающей с вещественными числами двойной точности, с использованием расширения AVX на процессоре Intel Xeon

Ответ:

 (1) 8 раз 

 (2) 2 раза 

 (3) 4 раза 

 (4) 16 раз 


Номер 3
Какого потенциального ускорения можно добиться при векторизации функции, работающей с вещественными числами двойной точности, на сопроцессоре Intel Xeon Phi

Ответ:

 (1) 8 раз 

 (2) 2 раза 

 (3) 4 раза 

 (4) 16 раз 


Упражнение 5:
Номер 1
Какой процент от пиковой производительности можно получить в функции, работающей с вещественными числами одинарной точности, без использования векторных расширений на процессоре Intel Xeon

Ответ:

 (1) до 6.25% 

 (2) до 12.5% 

 (3) до 25% 

 (4) до 50% 

 (5) до 100% 


Номер 2
Какой процент от пиковой производительности можно получить в функции, работающей с вещественными числами одинарной точности, без использования векторных расширений на сопроцессоре Intel Xeon Phi

Ответ:

 (1) до 6.25% 

 (2) до 12.5% 

 (3) до 25% 

 (4) до 50% 

 (5) до 100% 


Номер 3
Какое из следующих замечаний является верным:

Ответ:

 (1) использование скалярного кода на Intel Xeon Phi не позволит добиться хорошей производительности (в процентах от пика) 

 (2) использование векторного кода на Intel Xeon Phi не позволит добиться хорошей производительности (в процентах от пика) 


Упражнение 6:
Номер 1
Инструкция вида FMA позволяет выполнить следующую операцию:

Ответ:

 (1) a = a + b 

 (2) a = a + b * c 

 (3) a = a + b / c; 

 (4) a = a * b * c; 


Номер 2
Какое из следующих утверждений является верным?

Ответ:

 (1) инструкция вида FMA позволяет выполнить 3 арифметических операции за один такт 

 (2) инструкция вида FMA позволяет выполнить 2 арифметических операции без потери точности 

 (3) инструкция вида FMA позволяет выполнить 2 арифметических операции с округлением в конце 

 (4) инструкция вида FMA позволяет выполнить 3 арифметических операции с округлением в конце 


Номер 3
Как реализована расширенная поддержка математических функций в Xeon Phi?

Ответ:

 (1) основные математические функции вычисляются аппаратно 

 (2) основные математические функции вычисляются без потери точности 

 (3) 4 математические функции реализованы аппаратно для одинарной точности 

 (4) основные математические функции реализованы аппаратно для одинарной точности 


Упражнение 7:
Номер 1
Векторизация является параллелизмом на уровне:

Ответ:

 (1) параллельной работы нескольких процессов 

 (2) параллельной работы нескольких потоков 

 (3) параллельной работы нескольких ядер 

 (4) параллельного исполнения операций на одном ядре 


Номер 2
Какие из перечисленных директив компилятора предназначены для векторизации кода?

Ответ:

 (1) #pragma omp parallel for 

 (2) #pragma ivdep 

 (3) #pragma simd 

 (4) #pragma cilk_for 


Номер 3
Каким образом возможно использование векторных инструкций в программе?

Ответ:

 (1) только при их автоматической генерации компилятором при векторизации циклов 

 (2) только при вызове специальных функций-интринсик вручную 

 (3) при автоматической генерации компилятором или вручную 

 (4) только при использовании специальных векторных языков программирования 


Упражнение 8:
Номер 1
Для данного цикла определите, зависимы ли его итерации. При наличии зависимости охарактеризуйте ее характер.for (int i = 0; i < n – 1; i++)
    a[i + 1] = a[i] * 2 – 5;

Ответ:

 (1) итерации независимы 

 (2) каждая итерация зависит от предыдущей: a[i + 1] не может быть вычислено до a[i] 

 (3) каждая итерация зависит от следующей: a[i + 1] не может быть вычислено до a[i] 

 (4) каждая итерация зависит от предыдущей: a[i] не может быть вычислено до a[i - 1] 


Номер 2
Для данного цикла определите, зависимы ли его итерации. При наличии зависимости охарактеризуйте ее характер.for (int i = 0; i < n – 2; i++)
    a[i + 2] = a[i] * 3 + 1;

Ответ:

 (1) итерации независимы 

 (2) каждая итерация зависит от предыдущей: a[i + 1] не может быть вычислено до a[i] 

 (3) все четные итерации зависимы между собой, все нечетные итерации зависимы между собой, четные и нечетные итерации независимы 

 (4) каждая итерация зависит от предыдущей: a[i + 2] не может быть вычислено до a[i] 


Номер 3
Для данного цикла определите, зависимы ли его итерации. При наличии зависимости охарактеризуйте ее характер. Массивы a, b не пересекаются.for (int i = 0; i < n; i++)
    a[i] = b[i] * 2 + 8;

Ответ:

 (1) итерации независимы 

 (2) каждая итерация зависит от предыдущей: a[i + 1] не может быть вычислено до a[i] 

 (3) каждая итерация зависит от предыдущей: a[i] не может быть вычислено до b[i] 

 (4) каждая итерация зависит от предыдущей: a[i + 1] не может быть вычислено до b[i] 


Упражнение 9:
Номер 1
Для данного цикла определите, зависимы ли его итерации. При наличии зависимости охарактеризуйте ее характер. Массивы a, b не пересекаются.for (int i = 0; i < n - 2; i++)
    a[i] = b[i + 2] * 4 - 5;

Ответ:

 (1) итерации независимы 

 (2) каждая итерация зависит от предыдущей: a[i + 1] не может быть вычислено до a[i] 

 (3) каждая итерация зависит от предыдущей: a[i] не может быть вычислено до b[i + 2] 

 (4) все четные итерации зависимы между собой, все нечетные итерации зависимы между собой, четные и нечетные итерации независимы 


Номер 2
Для данного цикла определите, зависимы ли его итерации. При наличии зависимости охарактеризуйте ее характер. Массивы a, b, c не пересекаются.for (int i = 1; i < n - 2; i++)
    a[i] = b[i + 2] * c[i – 1];

Ответ:

 (1) итерации независимы 

 (2) каждая итерация зависит от предыдущей: a[i + 1] не может быть вычислено до a[i] 

 (3) каждая итерация зависит от предыдущей: a[i] не может быть вычислено до b[i + 2] 

 (4) каждая итерация зависит от следующей: a[i] не может быть вычислено до c[i – 1] 


Номер 3
Код «D[:] = sin(S[:]);» в Cilk Plus приведёт к:

Ответ:

 (1) ошибке компиляции 

 (2) векторизации 

 (3) инверсии операций 

 (4) потере времени 


Упражнение 10:
Номер 1
Какие ключи компилятора необходимо указать для корректной компиляции следующей функцииvoid GetOptionPrices(
  float * restrict pT, float * restrict pK, 
  float * restrict pS0, float * restrict pC)
{
  int i;
  float d1, d2, erf1, erf2;

  for (i = 0; i < N; i++)
  {
    d1 = (logf(pS0[i] / pK[i]) + (r + sig * sig * 0.5f) *
         pT[i]) / (sig * sqrtf(pT[i]));
    d2 = (logf(pS0[i] / pK[i]) + (r - sig * sig * 0.5f) * 
         pT[i]) / (sig * sqrtf(pT[i]));
    erf1 = 0.5f + 0.5f * erff(d1 / sqrtf(2.0f));
    erf2 = 0.5f + 0.5f * erff(d2 / sqrtf(2.0f));
    pC[i] = pS0[i] * erf1 - pK[i] * expf((-1.0f) * r * 
            pT[i]) * erf2;
  }
}

Ответ:

 (1) никаких, достаточно ключевого слова restrict 

 (2) -restrict  

 (3) -O2 

 (4) -debug 


Номер 2
Следующую функцию
void GetOptionPricesV4(float *pT, float *pK, float *pS0, float *pC)
{
  int i;
  float d1, d2, erf1, erf2;

#pragma simd
  for (i = 0; i < N; i++)
  {
    d1 = (logf(pS0[i] / pK[i]) + (r + sig * sig * 0.5f) *
         pT[i]) / (sig * sqrtf(pT[i]));
    d2 = (logf(pS0[i] / pK[i]) + (r - sig * sig * 0.5f) *
         pT[i]) / (sig * sqrtf(pT[i]));
    erf1 = 0.5f + 0.5f * erff(d1 / sqrtf(2.0f));
    erf2 = 0.5f + 0.5f * erff(d2 / sqrtf(2.0f));
    pC[i] = pS0[i] * erf1 - pK[i] * expf((-1.0f) * r * 
            pT[i]) * erf2;
  }
}
требуется собрать с поддержкой векторного набора команд AVX. Какие ключи компилятора необходимо использовать

Ответ:

 (1) никаких, достаточно указания #pragma simd 

 (2) -mavx 

 (3) -O3 


Номер 3
Следующую функциюvoid GetOptionPricesV7(float *pT, float *pK, float *pS0, float *pC)
{
  int i;
  float d1, d2, erf1, erf2, invf;
  float sig2 = sig * sig;

#pragma omp parallel for private(invf, d1, d2, erf1, erf2)
  for (i = 0; i < N; i++)
  {
    invf = invsqrtf(sig2 * pT[i]);
    d1 = (logf(pS0[i] / pK[i]) + (r + sig2 * 0.5f) * 
         pT[i]) * invf;
    d2 = (logf(pS0[i] / pK[i]) + (r - sig2 * 0.5f) * 
         pT[i]) * invf;
    erf1 = 0.5f + 0.5f * erff(d1 * invsqrt2);
    erf2 = 0.5f + 0.5f * erff(d2 * invsqrt2);
    pC[i] = pS0[i] * erf1 - pK[i] * expf((-1.0f) * r *
            pT[i]) * erf2;
  }
}
требуется собрать с поддержкой векторного набора команд AVX (ключ –mavx). Нужно ли модифицировать код?

Ответ:

 (1) нет, все, что необходимо компилятору для векторизации, в коде присутствует 

 (2) да, добавить ключевое слово restrict в объявления параметров в функции 

 (3) да, добавить прагму simd перед циклом 


Упражнение 11:
Номер 1
Пусть в программе присутствует следующий код:    for (int j = 2; j < 1000; j++)
    {
      if (number == 1) break; 
      int r;
      r = number % j;
      if (r == 0)
      {
        number /= j;
        divisors[idx].push_back(j);
        j--;
      }
    }    
Возможна ли векторизация данного цикла средствами компилятора для исполнения на Intel Xeon Phi?

Ответ:

 (1) нет, между итерациями есть зависимость 

 (2) векторизация возможна 

 (3) нет, длина цикла не кратна 2 


Номер 2
Пусть в программе присутствует следующий код:#define LOOP_SIZE 128
…
int rr[LOOP_SIZE];
for(int k = 0; k < LOOP_SIZE; k++)
{
  rr[k] = number % k;
}

Возможна ли векторизация данного цикла средствами компилятора для исполнения на Intel Xeon Phi?

Ответ:

 (1) нет, между итерациями есть зависимость  

 (2) векторизация возможна 

 (3) нет, длина цикла мала 


Номер 3
Пусть в программе присутствует следующий код:#define LOOP_SIZE 130
…
int rr[LOOP_SIZE];
for(int k = 0; k < LOOP_SIZE; k++)
{
  rr[k] = number % k;
}
Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?

Ответ:

 (1) нет, между итерациями есть зависимость  

 (2) векторизация возможна для части цикла 

 (3) нет, длина цикла мала 

 (4) нет, длина цикла не кратна 2 


Упражнение 12:
Номер 1
Пусть в программе присутствует следующий код:#define LOOP_SIZE 16
…
int rr[LOOP_SIZE];
for(int k = 0; k < LOOP_SIZE; k++)
{
  rr[k] = number % k;
}
Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?

Ответ:

 (1) нет, между итерациями есть зависимость  

 (2) векторизация возможна 

 (3) нет, длина цикла мала 


Номер 2
Пусть в программе присутствует следующий код:#define LOOP_SIZE 16
…
int rr[LOOP_SIZE];
…
p = 1;
for(int k = 0; k < LOOP_SIZE; k++)
{
  p *= rr[k];
}
Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?

Ответ:

 (1) нет, между итерациями есть зависимость  

 (2) векторизация возможна 

 (3) нет, длина цикла мала 


Номер 3
Пусть в программе присутствует следующий код:#define LOOP_SIZE 30
…
int rr[LOOP_SIZE];
…
p = 1;
for(int k = 0; k < LOOP_SIZE; k++)
{
  p *= rr[k];
}
Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?

Ответ:

 (1) нет, между итерациями есть зависимость  

 (2) векторизация возможна для части цикла 

 (3) нет, длина цикла мала 


Номер 4
Пусть в программе присутствует следующий код:#define LOOP_SIZE 128
…
int rr[LOOP_SIZE];
…
p = 1;
for(int k = 0; k < LOOP_SIZE; k++)
{
  p *= rr[k];
}
Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?

Ответ:

 (1) нет, между итерациями есть зависимость  

 (2) векторизация возможна 

 (3) нет, длина цикла мала 




Главная / Программирование / Введение в принципы функционирования и применения современных мультиядерных архитектур (на примере Intel Xeon Phi) / Тест 4