我可以只对代码的一部分启用矢量化吗
Can I enable vectorization only for one part of the code?
有没有一种方法可以只对代码的某些部分启用矢量化,比如pragma指令?基本上只有在编译代码的某些部分时才启用-ftree矢量化?例如,Pragma simd不能与gcc一起使用。。。
原因是,从基准测试中我们看到,使用-O3(可以实现矢量化)的时间比使用-O2更糟糕。但是,我们希望编译器尝试对代码的某些部分进行向量化循环。
我可以使用的一个解决方案是将编译器指令限制为一个文件。
是的,这是可能的。您可以为整个模块或单个功能禁用它。但是,对于特定的循环,您不能这样做。
对于单个功能,请使用CCD_ 1。
对于整个模块,-O3
自动启用-ftree-vectorize
。我不知道启用后如何禁用它,但您可以使用-O2
。如果您想使用除-ftree-vectorize
之外的所有-O3
,请执行此
gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts
gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
diff /tmp/O2-opts /tmp/O3-opts | grep enabled
然后包括除-ftree-vectorize
之外的所有选项。
编辑:我在手册页中没有看到-fno-tree-vectorize
,但它仍然有效,所以你可以做-O3 -fno-tree-vectorize
。
编辑:OP实际上希望为特定功能或整个模块启用矢量化。在这种情况下,对于单独的功能CCD_ 10和对于整个模块CCD_。
编辑(来自Antonio):理论上有一个pragma指令可以启用树向量化之后的所有函数
#pragma GCC optimize("tree-vectorize")
但它似乎不适用于我的g++编译器,可能是因为这里提到的错误:如何使用#pragma在G++中启用优化。另一方面,函数属性起作用。
相关文章:
- 普通环路未使用gcc 4.8.5自动矢量化
- 阵列火矢量化
- 使用矢量化c++的矩阵乘法
- 循环中标量乘积的自动矢量化
- 如何在clang++中禁用矢量化
- 加权外积的矢量化
- 手动矢量化/SSE 用于 C++ 中的复杂问题
- 包含比较的循环的自动矢量化
- pcl_ros::transformPointCloud的矢量化
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- (如何)我可以使用openmp矢量化"std::complex<double>"吗?
- C 矩阵乘法自动矢量化
- 矢量化 :乘以_m256i元素
- 是否可以使用 SSE 对此嵌套进行矢量化?
- 为什么内联函数中的循环无法正确自动矢量化
- 是否保证 OpenMP 矢量化
- AVX,SSE总和比gcc自动矢量化慢
- 嵌套矢量化 OpenMP 循环,在最内层循环中具有多行代码
- 模乘法的矢量化
- 我可以只对代码的一部分启用矢量化吗