这个问题可以通过使用无符号取模运算符解决。以下是一个使用无符号取模运算符的示例代码:
#include
void vector_mod(unsigned int *data, int size, unsigned int divisor) {
__m512i div = _mm512_set1_epi32(divisor);
__m512i *ptr = (__m512i *)data;
__m512i zero_vec = _mm512_setzero_si512();
__m512i mod_vec;
for (int i = 0; i < size; i += 16) {
mod_vec = _mm512_maskz_rem_epu32(0xFFFF, ptr[i], div);
ptr[i] = _mm512_maskz_sub_epi32(0xFFFF, ptr[i], mod_vec);
ptr[i] = _mm512_max_epu32(zero_vec, ptr[i]);
}
}
在这个示例中,我们使用 rem_epu32
函数进行无符号取模,这避免了在输入非常大时出现负结果的问题。