在C语言中,编译器在向量加法运算中要读取的第一个向量是什么?
我正在分析代码缓存的操作,出现了以下问题:在C语言中,编译器在向量加法运算中要读取的第一个向量是什么?,c,caching,memory,vector,C,Caching,Memory,Vector,我正在分析代码缓存的操作,出现了以下问题: C[i] = B[i] + A[i]; G[i] = x*F[i]; 这是代码中我有疑问的部分。上下文:我的高速缓存内存有这5个向量中最多4个的空间。它与LRU算法(最近使用的最少)配合使用,因此C、B、a和F存储时存在任何问题,但G在缓存中没有空间,因此最长时间未使用的向量将替换为G的向量值。以下是问题: A是第一个还是B?C编译器遵循什么原则来决定首先读取哪个元素?这取决于使用哪种编译器(GCC、ICC…),还是它们通常遵循相同的原则?在C[i]
C[i] = B[i] + A[i];
G[i] = x*F[i];
这是代码中我有疑问的部分。上下文:我的高速缓存内存有这5个向量中最多4个的空间。它与LRU算法(最近使用的最少)配合使用,因此C、B、a和F存储时存在任何问题,但G在缓存中没有空间,因此最长时间未使用的向量将替换为G的向量值。以下是问题:
A是第一个还是B?C编译器遵循什么原则来决定首先读取哪个元素?这取决于使用哪种编译器(GCC、ICC…),还是它们通常遵循相同的原则?在
C[i]=B[i]+A[i]代码>编译器可以先加载A[i]
或者先加载B[i]
。C标准对本次订购没有任何要求
具有G[i]=x*F[i]代码>之后,编译器必须在存储C[i]
后加载F[i]
,除非它可以确定F[i]
与C[i]
不是同一个对象。如果可以确定,则可以按任意顺序加载A[i]
、B[i]
和F[i]
类似地,如果它可以确定G[i]
没有重叠C[i]
,则它可以按任意顺序存储C[i]
和G[i]
如果此代码出现在循环中,这种允许的重新排序将扩展到循环迭代之间的元素:例如,如果编译器可以确定它不会影响定义的结果,那么它可以在加载当前迭代的a[i]
之前从“未来”迭代加载B[i]
。它可以从B
加载四个元素,从A
加载四个元素,从F
加载四个元素,并在将任何元素存储到C
或G
之前执行所有算术运算。(通常,编译器没有数组重叠的必要信息,因此除非您以某种方式向它提供这些信息,例如使用restrict
声明指针,或者使用特殊的pragma或编译器内置来告诉它这些事情,否则它不会进行这种重新排序。)
一般来说,C标准对实际操作的顺序是允许的。它只要求满足它指定的可观察行为。您不应期望仅基于标准C代码首先加载任何特定元素。在本文中,“vector”是什么意思?上海证券交易所数组?向量数组,只是一个简单的1024长度的数组,用calloc()创建并填充了一些数据。我没有考虑这个,我认为它有一个标准。谢谢你帮助我。