向量化源码修改建议
向量化建议  | 
无法向量化原因  | 
修改方案  | 
修改样例  | 
||||
|---|---|---|---|---|---|---|---|
提取循环控制变量  | 
for循环的循环控制变量为结构体的成员,编译器无法确定循环结束条件,导致无法自动向量化循环。  | 
将循环控制变量提取到循环外。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
修改循环控制条件  | 
Clang 15支持向量化,Clang 15版本以下无法支持自动向量化实现。  | 
循环条件从<=改成<,循环长度从len改成len+1。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
增加自动向量化编译指示  | 
编译器评估向量化收益后采用保守策略,不进行自动向量化。  | 
添加pragma编译指示强行对代码进行自动向量化。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
明确指针指向的内存不会被其他指针引用  | 
无法确定指针指向的内存是否被其他指针引用,编译器将放弃自动向量化。  | 
添加restrict关键字修饰指针变量。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
保持数据类型长度一致  | 
类型不匹配,编译器无法进行自动向量化。  | 
改变变量的类型,从long型变为int型。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
循环拆分  | 
循环中的运算左值空间为固定空间,存在循环依赖关系,编译器无法进行向量化。  | 
拆分循环,将每一轮循环运算左值独立存储再归并。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
简化条件分支内的代码逻辑  | 
在条件分支语句中存在较复杂的运算,导致无法自动向量化。  | 
将运算语句提取到条件分支之外。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
数据类型改为无符号类型  | 
数据类型不一致,编译器无法向量化。  | 
改变数据的类型,从signed型变为unsigned型。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
降低计算精度  | 
计算精度高,编译器为保障计算精度不进行自动向量化。  | 
降低计算结果的精度。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
循环拆分  | 
循环内的语句较多,编译器无法判断变量的依赖关系,不进行向量化。  | 
将循环内容的多个语句拆分到多个循环中。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
减少循环内的函数调用  | 
循环内的存在函数调用,编译器无法进行向量化。  | 
将函数调用相关的计算提取到循环外。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
利用Fortran关键字  | 
未充分利用Fortran语言特性。  | 
使用数组赋值代替循环来实现多个数据的操作。  | 
代码样例如下: 
 修改方式样例如下: 
  | 
||||
明确指针指向的内存不会被其他指针引用,同时增加编译标识  | 
无法确定指针指向的内存是否被其他指针引用,编译器将放弃自动向量化。  | 
添加restrict关键字修饰指针变量。  | 
代码样例如下: 
 修改方式样例如下: 
  |