Введение в принципы функционирования и применения современных мультиядерных архитектур (на примере Intel Xeon Phi) - ответы
Количество вопросов - 241
#define LOOP_SIZE 128…int rr[LOOP_SIZE];for(int k = 0; k < LOOP_SIZE; k++){ rr[k] = number % k;}Возможна ли векторизация данного цикла средствами компилятора для исполнения на Intel Xeon Phi?
F1(); #pragma offload target(mic:0) signal(s1) { F2(p1, p2); }В каком порядке будут исполняться функции F1 и F2?
#define LOOP_SIZE 128…int rr[LOOP_SIZE];…p = 1;for(int k = 0; k < LOOP_SIZE; k++){ p *= rr[k];}Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?
void factorization() {#pragma omp parallel for for (int i = 1; i < NUM_NUMBERS; i++) { int number = i; int idx = number; for (int j = 2; j < idx; j++) { if (number == 1) break; int r; r = number % j; if (r == 0) { number /= j; divisors[idx].push_back(j); j--; } } }}факторизует числа в диапазоне от 1 до NUM_NUMBERS. Добавление к прагме parallel параметра schedule(static, chunk) при правильном выборе chunk
#!/bin/shmpicc –O2 –openmp main.cpp –o ./program_namempicc –O2 –openmp –mmic main.cpp –o ./program_name.micДанный скрипт используется для компиляции программы, которая должна исполняться в режиме:
S,N,1,2.0.0.#!/bin/shexport PPN=2export MICperNODE=2sbatch –N 2 –-gres=mic:2 symmetric_run.sh ./program_nameДанный скрипт обеспечивает запуск программы в симметричном режиме на кластере с системой управления SLURM.Сколько всего процессов будет создано при запуске программы?
task_scheduler_init init; init.initialize(4);
#pragma offload target(mic:0) wait (s1) { F1(p1, p2); } F2();В каком порядке будут исполняться функции F1 и F2?
#define LOOP_SIZE 24…int rr[LOOP_SIZE];for(int k = 0; k < LOOP_SIZE; k++){ rr[k] = number % k;}Какого следует ожидать ускорения в результате векторизации по сравнению со скалярной версией на Intel Xeon Phi?
for (int i = 0; i < n – 2; i++) a[i + 2] = a[i] * 3 + 1;
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). Нужно ли модифицировать код?
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?
__attribute__((target(mic))) void func(float* a, float* b, int count, float c, float d){ #pragma omp parallel for for (int i = 0; i < count; ++i) { a[i] = b[i]*c + d; }}int main(){ const int count = 100; float a[count], b[count], c, d; … #pragma offload target(mic) [Параметры] func(a, b, count, c, d); …}Какие параметры нужно добавить в соответствующее место в приведенном выше коде (вместо "[Параметры]"), чтобы обеспечить корректное и эффективное выполнение кода:
#!/bin/shmpiexec.hydra –perhost 1 ./program_nameДанный скрипт обеспечивает запуск программы в режиме:
#define LOOP_SIZE 30…int rr[LOOP_SIZE];…p = 1;for(int k = 0; k < LOOP_SIZE; k++){ p *= rr[k];}Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?
for (int i = 1; i < n - 2; i++) a[i] = b[i + 2] * c[i – 1];
#!/bin/shmpiexec.hydra –host mic0 –n 1 –perhost 1 ./program_name.micДанный скрипт обеспечивает запуск программы в режиме:
#!/bin/shexport MICperNODE=1sbatch –N 4 –-gres=mic:2 native_run.sh ./program_nameДанный скрипт обеспечивает запуск программы в режиме исполнения только на сопроцессоре на кластере с системой управления SLURM.Сколько процессов на узел будет создано при запуске программы?
#pragma offload target(mic:0) { F1(p1, p2); } F2();В каком порядке будут исполняться функции F1 и F2?
#define LOOP_SIZE 16…int rr[LOOP_SIZE];…p = 1;for(int k = 0; k < LOOP_SIZE; k++){ p *= rr[k];}Какого следует ожидать ускорения в результате векторизации по сравнению со скалярной версией на Intel Xeon Phi?
for (int i = 0; i < n – 1; i++) a[i + 1] = a[i] * 2 – 5;
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; }}
#define LOOP_SIZE 16…int rr[LOOP_SIZE];for(int k = 0; k < LOOP_SIZE; k++){ rr[k] = number % k;}Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?
for (int i = 0; i < n; i++) a[i] = b[i] * 2 + 8;
for (int i = 0; i < n - 2; i++) a[i] = b[i + 2] * 4 - 5;
void factorization() {#pragma omp parallel for for (int i = 1; i < NUM_NUMBERS; i++) { int number = i; int idx = number; for (int j = 2; j < idx; j++) { if (number == 1) break; int r; r = number % j; if (r == 0) { number /= j; divisors[idx].push_back(j); j--; } } }}факторизует числа в диапазоне от 1 до NUM_NUMBERS. Добавление к прагме parallel параметра schedule(static, 1) приведет к
#!/bin/shexport MICperNODE=2sbatch –N 2 –-gres=mic:4 native_run.sh ./program_nameДанный скрипт обеспечивает запуск программы в режиме исполнения только на сопроцессоре на кластере с системой управления SLURM.Сколько всего процессов будет создано при запуске программы?
#pragma offload target(mic:0) signal(s1) { F1(p1, p2); } F2();В каком порядке будут исполняться функции F1 и F2?
#define LOOP_SIZE 130…int rr[LOOP_SIZE];for(int k = 0; k < LOOP_SIZE; k++){ rr[k] = number % k;}Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?
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. Какие ключи компилятора необходимо использовать
int idx = number; for (int j = 2; j < number; j++) { if (idx == 1) break; int r; r = idx % j; if (r == 0) { idx /= j; divisors[number].push_back(j); j--; } }
F1(); #pragma offload target(mic:0) wait(s1) { F2(p1, p2); }В каком порядке будут исполняться функции F1 и F2?
#define LOOP_SIZE 24…int rr[LOOP_SIZE];…p = 1;for(int k = 0; k < LOOP_SIZE; k++){ p *= rr[k];}Какого следует ожидать ускорения в результате векторизации по сравнению со скалярной версией на Intel Xeon Phi?
#!/bin/shmpiexec.hydra –hosts 2 node0 node1 –n 2 –perhost 1 ./program_name: \–hosts 4 mic0 mic1 mic2 mic3 –n 4 –perhost 1 ./program_name.micДанный скрипт обеспечивает запуск программы в режиме:
void factorization() {#pragma omp parallel for for (int i = 1; i < NUM_NUMBERS; i++) { int number = i; int idx = number; for (int j = 2; j < idx; j++) { if (number == 1) break; int r; r = number % j; if (r == 0) { number /= j; divisors[idx].push_back(j); j--; } } }}факторизует числа в диапазоне от 1 до NUM_NUMBERS. Добавление к прагме parallel параметра schedule(dynamic) уменьшит время
1. i number;2. for j = 2 to number3. if (i == 1) break; 4. r i % j;5. if (r == 0)6. i i / j;7. save_divisor(number, j);8. j j - 1;
int r = 0;int main(){ #pragma offload target(mic:0) { setR(); } printf("%d", r);}...setR(){ r = 1;}Что будет выведено на экран?
#define LOOP_SIZE 16…int rr[LOOP_SIZE];…p = 1;for(int k = 0; k < LOOP_SIZE; k++){ p *= rr[k];}Возможна ли векторизация данного цикла средствами компилятора, для исполнения на Intel Xeon Phi?