Прочитав несколько разных статей и не найдя ответа, я собираюсь представить проблему, а затем задать вопрос.
У меня есть фрагмент кода, который можно сократить до серии циклов, похожих на следующие:
#pragma omp parallel for simd
for(int i = 0; i < a*b*c; i++)
{
array1[i] += array2[i] * array3[i];
}
Теперь большинство примеров использования SIMD, с которыми я столкнулся, имеют,b и c исправлены во время компиляции, что позволяет провести оптимизацию.Однако мой код требует, чтобы значения ab и c определялись во время выполнения.
Допустим, что для случая компьютера, который я использую, регистр может соответствовать 4 значениям, и что значение b c равно 127. Я понимаю, что время компиляции для этогочто компилятор будет векторизовать все, что полностью делится на 4, а затем сериализовать все остальное (пожалуйста, исправьте это, если я ошибаюсь).Однако это когда компилятор полностью знает проблему.Если бы я теперь разрешил выбор времени выполнения a, b и c и достиг значения 127, как бы происходила векторизация?Наивно я предположил бы, что закулисный код достаточно умен, чтобы понять, что это может произойти, имеет как последовательный, так и векторный код и вызывает наиболее подходящий.Тем не менее, поскольку это предположение, я был бы признателен кому-то более знающему по этому вопросу, чтобы просветить меня дальше, поскольку я не хочу случайных переполнений или отсутствия обработки данных из-за недопонимания.
На случай, если это важно, я использую OpenMP 4.0 с компилятором C gcc, хотя я надеюсь, что это не изменит ваш ответ, так как я всегда буду пытаться использовать последнюю версию OpenMP и, к сожалению, возможно, потребуетсярегулярно меняйте компилятор.