База ответов ИНТУИТ

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

<<- Назад к вопросам

Следующую функцию
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). Нужно ли модифицировать код?

(Отметьте один правильный вариант ответа.)

Варианты ответа
нет, все, что необходимо компилятору для векторизации, в коде присутствует(Верный ответ)
да, добавить прагму simd перед циклом
да, добавить ключевое слово restrict в объявления параметров в функции
Похожие вопросы
Следующую функцию
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. Какие ключи компилятора необходимо использовать
Какие ключи компилятора необходимо указать для корректной компиляции следующей функции
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;  }}
__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);    …}
Какие параметры нужно добавить в соответствующее место в приведенном выше коде (вместо "[Параметры]"), чтобы обеспечить корректное и эффективное выполнение кода:
Следующая функция
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) уменьшит время
Следующая функция
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) приведет к
Следующая функция
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
При использовании директивы #pragma offload с параметром in для каких данных поддерживается копирование?
При использовании директивы #pragma offload с параметром in для каких данных поддерживается копирование?
При использовании директивы #pragma offload с параметром in для каких данных поддерживается копирование?
При использовании директивы #pragma offload с параметром in для каких данных поддерживается копирование?