У меня есть код с #pragma clang loop vectorize(enable)
, который обеспечивает векторизацию.Для некоторых типов эта векторизация невозможна - пример:
#include <string>
#include <vector>
template <typename T>
void double_entries(std::vector<T>& vec) {
#pragma clang loop vectorize(enable)
for (auto i = 0; i < 100; ++i) vec[i] = vec[i] + vec[i];
}
int main() {
auto char_vector = std::vector<char>{100};
auto string_vector = std::vector<std::string>{100};
double_entries(char_vector);
double_entries(string_vector);
}
https://godbolt.org/z/EgiogQ
Clang предупреждает меня об этом:
<source>:7:2: warning: loop not vectorized: failed explicitly specified loop vectorization [-Wpass-failed=loop-vectorize]
for (auto i = 0; i < 100; ++i) vec[i] = vec[i] + vec[i];
^
Это не 'Это действительно помогает, если я не знаю, что инициализация std::string
double_entries
вызывает проблему.
Есть ли способ заставить Clang напечатать все задействованные экземпляры шаблона?Как только я смогу идентифицировать проблемные типы, используя этот вывод компилятора, я могу просто отключить векторизацию для них.