编译器在没有明确指令的情况下,通常会发出矢量(SIMD)指令吗?
c ++ 17将并行性的扩展添加到标准库(例如std::sort(std::execution::par_unseq, arr, arr + 1000),这将允许使用多个线程和向量指令进行排序). 我注意到Microsoft的实验实现提到VC ++编译器缺乏对矢量化的支持这个2011年问题在Quora上,这表明编译器将在可能的情况下进行矢量化. 也许,编译器只会使诸如std::array之类的非常明显的案例化,而不仅仅是C ++ 17的显式并行化. 因此,我的问题是:当前编译器当不明确告知这样做时会自动矢量化我的代码吗? (为了使这个问题更具体,让我们将其缩小到具有SIMD支持的Intel X86 CPU,以及GCC,Clang,MSVC和ICC的最新版本.) . 作为扩展:其他语言的编译器是否可以更好地自动矢量化(也许是由于语言设计)(以便C ++标准委员会决定有必要显式(C ++ 17风格)矢量化)? ) 解决方案 最佳的编译器用于自动发现
18 2024-04-22
编程技术问答社区
使用 GCC 强制自动矢量化
在这里我非常简单的问题.对于ICC,我知道可以使用#pragma SIMD强制编译器选择不矢量化的循环的矢量化.海湾合作委员会有类似的东西吗?或者,是否有任何计划在以后的版本中添加此功能? 非常相关,用石墨强迫矢量化呢? 解决方案 只要允许GCC使用SSE/SSE2/ETC指令,编译器就会在意识到它是"值得"的情况下总体生产矢量说明.像编译器中的大多数事情一样,这需要程序员的运气/计划/护理,以避免编译器认为"也许这不是安全"或"这太复杂,我不知道发生了什么".但是,如果您使用合理现代版本的GCC(4.x版本都应该这样做),则经常会成功. 您可以通过添加-msse>或-msse2(等稍后的SSE扩展)来使编译器使用SSE或SSE2指令. -msse2在x86-64中默认. 但是,我不知道您可以强迫这一点.编译器要么这样做是因为它很高兴它是一个很好的解决方案,要么不会. 对不起,无法回答有关石墨.
26 2024-04-22
编程技术问答社区
使用 Rust 自动矢量化
我是Rust/Simd的新手,并且我有以下代码片段作为程序的瓶颈,我想知道我是否可以利用它的自动化功能 fn is_subset(a: Vec, b: Vec) -> bool { for i in 0..a.len() { if (a[i] & !b[i]) != 0 { return false; } } true } 我也有一种编写此书的替代方法(使用迭代器,因此Trip Count将在预先知道)中,这会创建自动化吗? fn is_subset(a: Vec, b: Vec) -> bool { return a.iter().zip(b.iter()).all(|(x, y)| x & y == *x) } 解决方案 llvm(和GCC)不知道如何自动化无法预先计算的跳闸计数的循环.这排除了这样的搜索循环. ICC Clas
36 2024-04-22
编程技术问答社区
什么是 "矢量化"?
现在几次,我在Matlab的Matlab,Fortran ...其他一些...但是我从未找到解释是什么意思,它的作用是什么?所以我在这里问,矢量化是什么,例如,"循环已被矢量化"是什么意思? 解决方案 许多CPU具有"向量"或" SIMD"指令集,这些指令集同时应用于两个,四个或更多数据.现代X86芯片具有SSE说明,许多PPC芯片都有" Altivec"说明,甚至某些手臂芯片也有一个矢量指令,称为NEON. "矢量化"(简化)是重写循环的过程,因此它不会处理数组n次的单个元素,而是同时处理数组的4个元素. 我选择了4,因为这是现代硬件最有可能直接支持32位浮子或ints. 矢量化和循环展开之间的差异: 考虑以下非常简单的循环,该循环添加了两个数组的元素,并将结果存储到第三个数组中. for (int i=0; i
12 2024-04-22
编程技术问答社区
如何实现自动矢量化数组比较功能
这是此 post .免责声明:我进行了零分析,甚至没有应用程序,这纯粹是让我了解有关矢量化的更多信息. 我的代码在下面.我正在使用I3 M370的机器上使用GCC 4.9.4编译.我希望的第一个循环矢量化.但是,第二个循环检查温度的每个元素并未使用所有" ANDB"指令进行矢量化.我希望它会用#define ARR_LENGTH 4096 #define block_size 4 typedef float afloat __attribute__ ((__aligned__(16))); char all_equal_2(afloat *a, afloat *b){ unsigned int i, j; char r = 1; unsigned int temp[block_size] __attribute__((aligned(16))); //for (i=0; i
32 2024-04-09
编程技术问答社区
为什么gcc的自动矢量化对大于3x3的卷积矩阵不起作用?
我已经实施了卷积矩阵 的以下程序 #include #include #define NUM_LOOP 1000 #define N 128 //input or output dimention 1 #define M N //input or output dimention 2 #define P 5 //convolution matrix dimention 1 if you want a 3x3 convolution matrix it must be 3 #define Q P //convolution matrix dimention 2 #define Csize P*Q #define Cdiv 1 //div for filter #define Coffset 0 //offset //functions void unusual(); //unusual impleme
4 2024-04-07
编程技术问答社区
为什么GCC不显示矢量化信息?
我正在使用Windows 7上的C程序使用CodeBlocks.该程序正在使用OMP库. GCC版本为4.9.2. mingw x86_64-w64-mingw32-gcc-4.9.2.exe. 使用的标志为:-fopenmp -O3 -mfpmath=sse -funroll-loops -ftree-loop-distribution -ftree-vectorize -ftree-vectorizer-verbose=2. 该程序运行正确,但问题在于它没有显示有关循环是否矢量的信息.我该如何解决? 构建日志信息: ---------------构建:在****中发布(编译器:GNU GCC编译器)--------------------------------------- > X86_64-W64-MINGW32-GCC-4.9.2.EXE -WALL -O2 -March = Corei7 -farped -optimizations -o3 -fop
20 2024-04-07
编程技术问答社区
编译器是否对普通C代码使用SSE指令?
我默认情况下看到人们使用-msse -msse2 -mfpmath=sse标志,希望这可以提高性能.我知道当C代码中使用特殊的向量类型时,SSE会参与.但是,这些标志对常规C代码有任何影响吗?编译器是否使用SSE优化常规C代码? 解决方案 是的,如果您完全优化编译,那么现代编译器会自动使用SSE2自动矢量化. clang在-O2上矢量化循环,gcc at -O3. (gcc12在-O2>>>中启用矢量化,但仅在"非常便宜" 时,仍然需要-O3以矢量化大多数循环使用运行时变量的行程计数.) 即使在-O1或-Os上,编译器也将使用SIMD加载/存储指令来复制或初始化structs 或与整数寄存器更宽.这实际上并不算作自动矢量化;这更像是针对小型固定尺寸块的默认内置memset/memcpy策略的一部分. (如果没有-fno-builtin,这也适用于memcpy的明确使用. 31563078/how-do-do-enable-sse for-my-foreesting-b
14 2024-04-06
编程技术问答社区
重叠数组的总和,自动矢量化,以及限制
Arstechnia最近有一篇文章为什么某些编程语言比其他语言更快.它比较了fortran和c,并提到了总结阵列.在Fortran中,假定数组不会重叠,因此可以进一步优化.在C/C ++指针中,可能会重叠,因此该优化一般不能使用.但是,在C/C ++中,可以使用restrict或__restrict关键字来告诉编译器不要假设指针重叠.因此,我开始研究这一点. 以下代码在GCC和MSVC中进行了矢量化. void dot_int(int *a, int *b, int *c, int n) { for(int i=0; i
12 2024-04-06
编程技术问答社区
MSVC 2017是否支持自动CPU调度?
我在使用SSE2体系结构并检测AVX支持运行时的几个网站上阅读了MSVC实际上可以发出的AVX说明.是真的吗? 我测试了各种循环,这些循环肯定会从AVX/AVX2支持中受益,但是当在调试器中运行时,我真的找不到任何AVX说明. 当使用/拱门:AVX时,它会发出AVX指令,但是它当然会在不支持它的CPU上崩溃(测试),因此也没有运行时检测.我可以使用AVX内在信息,它将成功地从中创建AVX指令.有什么想法吗? 解决方案 我已经联系了VC ++团队,答案是"否".在问题下的注释中链接的错误报告仅显示普通错误,而不是自动示意图代码生成器中的错误. 因此,如果指定了/拱门:SSE2(默认情况下),VC ++只能自动dispatch至SSE4.这是当前支持的唯一自动划分的形式.换句话说,VC ++不能自动dispatch至avx/avx2.
如何写出编译器可以有效编译成SSE或AVX的c++代码?
假设我有一个用C ++编写的函数,该函数在许多向量上执行矩阵矢量乘法.它需要一个指向向量数组进行转换的指针.我是否正确地假设编译器无法有效地将其优化为SIMD指令,因为它不知道经过的指针的对准(需要在编译时对SSE或AVX的32个字节对​​准16个字节对齐)?或数据对齐不相关的数据的内存对齐和数据对齐无关,仅会影响缓存性能? 如果对齐对生成的代码很重要,我该如何让(Visual C ++)编译器知道我打算仅通过一定的对齐来传递值? 解决方案 在理论上,自尼哈勒姆以来,在英特尔处理器上应无关紧要.因此,您的编译器应该能够产生指针,其中指针是否对齐不是问题. 未对齐的负载/商店指令自尼哈勒姆以来的英特尔处理器上具有相同的性能.但是,直到AVX到达带有桑迪桥的到达之前,不一致的载荷不能用另一个用于微型融合的操作折叠. 此外,即使在AVX之前,也可以避免具有16个字节对齐内存的高速缓存线拆分的惩罚,因此编译器添加代码仍然是合理的,直到指针对准16字节. . 由于
16 2024-03-21
编程技术问答社区
在visual studio 2012中,Eigen类型的向量的自动向量化表现不佳
我有Eigen :: vector3D类型的std ::向量,并且当我使用Microsoft Visual Studio 2012编译此代码时,具有/QVEC-REPORT:2 flag on报告矢量化详细信息.如MSDN页面所指定的,它显示的循环未出于原因1304(循环包含不同类型的作业) - https://msdn.microsoft.com/en-us/library/jj658585.aspx 我的代码如下: #include #include #include #include int main(char *argv[], int argc) { int tempSize=100; /** I am aligning these vectors as specfied on http://eigen.tuxfamily.org/dox/group__TopicStl
14 2023-11-24
编程技术问答社区
GCC,CLANG和MSVC的C ++自动矢量化要求
以下语句正确? 使用GCC和Clang,如果我使用: -O2 -ftree-vectorize -march=XYZ(xyz是目标指令集:本机,SSE,AVX2等) -O3 -march=XYZ 使用MSVC,如果我使用: ,我的代码将被自动向量. /O2 此视频似乎建议我不需要使用MSVC指定体系结构.那是对的吗?编译器将默认使用本机架构,如果找不到向量说明,则在运行时倒退. 解决方案 我不需要使用MSVC指定体系结构.这是正确的吗? 是的,这确实是正确的.使用MSVC,默认情况下,启用了自动矢量器,并为最快的矢量化选择了适当的指令集.此外,即使您确实指定了arch,自动矢量器也可能会生成与/arch switch的指令不同的指令 - 如在另一个注意事项上,与GCC或Clang相比,VS Vectorizer缺乏相当多的功能. 使用GCC和Clang,如果我使用-O2 -ftree-vectorize -march=XYZ编译,我的
12 2023-11-20
编程技术问答社区
GCC对矢量化的暗示
我希望GCC矢量化以下代码.-fopt-info告诉我GCC当前不是.我相信问题是W的障碍或k的向后增加.请注意,height和width是常数,index_type设置为unsigned long当前. 我删除了一些评论 114 for (index_type k=height-1;k+1>0;k--) { 116 for (index_type i=0;i
26 2023-11-17
编程技术问答社区