Я новичок в расширении вектора GCC C. Согласно руководству, результат сравнения одного вектора с другим в форме (test = vec1 > vec2;) заключается в том, что "test" содержит 0 в каждом элементе, который является ложным, и -1 в каждом элементе, который является истинным.
Но как быстро проверить, верно ли ANY из сравнения элементов? И, далее, как определить, который является первым элементом, для которого было выполнено сравнение?
Например, с помощью
vec1 = {1,1,3,1};
vec2 = {1,2,2,2};
test = vec1 > vec2;
Я хочу определить, содержит ли "тест" любую правду (ненулевые элементы). В этом случае я хочу, чтобы "test" сменился на true, потому что существует элемент, для которого vec1 больше vec2 и, следовательно, элемент в тесте, содержащий -1.
Кроме того, или, альтернативно, я хочу быстро обнаружить, что элемент WHICH не прошел тест. В этом случае это просто будет число 2. Говоря другим способом, я хочу проверить, который является первым ненулевым элементом.
int hasAnyTruth = ...; // should be non-zero. "bool" works too since C99
int whichTrue = ...; // should contain 2, because test[2] == -1
Я предполагаю, что мы могли бы использовать команду simd reduce-addition (?), чтобы суммировать все в векторе в число и сравнивать эту сумму с 0, но я не знаю, как (или если есть более быстрый способ). Я предполагаю, что для второго вопроса необходим какой-то вид argmax, но опять же, я не знаю, как поручить GCC использовать его на векторах.