Моя цель состоит в том, чтобы условно присвоить значения массиву на основе неявного значения индекса, используя обозначение массива Cilk Plus с Intel icc
компилятор, версия 13.1.3 20130607
,
Рассмотрим следующий код:
T test[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
if(test[:] < 5) {
test[:] = 10 - __sec_implicit_index(0);
}
Этот код компилируется нормально, но когда я пытаюсь его запустить, я получаю следующую ошибку:
undefined symbol: __sec_implicit_index
Заметка Хотя это может выглядеть как ошибка компоновки, это не так, поскольку следующий код компилируется и работает нормально (условие было снято):
T test[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
test[:] = 10 - __sec_implicit_index(0);
Итак, мой вопрос: возможно ли выполнить поведение условного кода, описанного ниже, с помощью Cilk Plus Array Notation?
T test[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for(int i = 0; i < 10; i++) {
if(i < 5) {
test[i] = 10 - i;
}
}
Пример верный. Проблема в баге в icc 13.1.3. Бета-версия icc 14.0 правильно скомпилирована и выполнена для меня.
Для icc 13.1.3 я обнаружил, что #pragma simd в целом более надежен как способ указать разрешение на векторизацию. С этим ваш пример выглядит так:
T test[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
#pragma simd
for(int i = 0; i < 10; i++) {
if(i < 5) {
test[i] = 10 - i;
}
}
Это, конечно, теряет удобство обозначения массива.
Других решений пока нет …