如何向C++编译器指示数组长度以实现自动向量化
寻求适配Clang的数组长度编译器提示方法
以下示例展示了字符序列处理代码无法自动向量化的常见问题:find_a()函数用于将current_index指向字符串中首次出现的'a':
void find_a(size_t *current_index, const std::string &code) { const size_t code_size = code.size(); size_t ci = *current_index; while (ci < code_size && code[ci] != 'a') { ci++; } *current_index = ci; } void find_a_vectorize(size_t *current_index, const std::string &code) { const size_t code_size = code.size(); size_t ci = *current_index; while (ci < (code_size-128)) { char cpy[128]; std::memcpy(cpy, &code[ci], 128); bool found = false; for (int i = 0; i < 128; i++) { if (cpy[i] == 'a') {found = true;} } if (found){ break; } ci+=128; } while (ci < code_size && code[ci] != 'a') { ci++; } *current_index = ci; }
之所以必须手动编写第二个版本才能实现向量化,是因为编译器无法确定字符串内部数组的长度,向量化操作可能会触发越界读取。因此所有包含提前break或return的循环都无法被自动向量化,这会导致性能损失,且第二个版本的代码可读性与维护性更差。
我已查阅资料并尝试过__restrict等方法,但都无法解决问题。现在需要一种类似__builtin_guaranteed_minimal_array_length(&code[0], code_size)的编译器提示方法,仅需适配Clang编译器即可,请问是否存在这样的方法?
内容的提问来源于stack exchange,提问作者NoNae
相关产品推荐
相关产品推荐

