Ложный обмен Диагностика / Профилактика

В моем коде у меня есть следующий раздел (упрощенно)

  #pragma omp parallel for 
  for(i = 0; i < N; i++) {
    int x = struct_arr[i].x;
    double y = struct_arr[i].y;
    double z = struct_arr[i].z;
    double w = struct_arr[i].w;
    out[i].x = get_new_x(x,y,z,w);
  }

который при распараллеливании страдает от резкого замедления. Я подозревал, что была проблема с ложным разделением, и с помощью valgrind я обнаружил, что в данном выполнении было много пропусков кеша.

Я не предоставил подробностей о том, что происходит в get_new_x, так как я хочу сосредоточиться на одной вещи за раз; Разумно ли предположить, что в части, предшествующей вызову функции, происходит некоторое ложное разделение? Каждый поток будет иметь свои локальные переменные для x,y,z,w, но все они будут читать из одного массива. Может ли этого быть достаточно, чтобы вызвать пропадание кэша? Точно так же я подозреваю, что при записи из get_new_x в out[] может возникнуть проблема с конфликтом кэша.

Я думаю, что все это возможные причины ложного обмена, но как это исправить? Может ли какая-либо операция (чтение против записи) более или менее вызвать ложные проблемы с совместным использованием?

0 ответов

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