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