在 C 中的向量加法运算中,编译器要读取的第一个向量是什么?

What is the first vector to be read by the compiler in a vector addition operation in C?

我在分析一段代码的缓存操作,出现了这个问题:

C[i] = B[i] + A[i];
G[i] = x*F[i];

这是我有疑问的代码部分。上下文:我的缓存内存有 space 这 5 个向量中的最多 4 个。它与 LRU 算法(最近最少使用)一起工作,因此 C、B、A 和 F 存储时有任何问题,但 G 在缓存中没有 space 因此最长时间未使用的向量是替换为 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]与[=15不是同一个对象=].如果它可以确定,那么它可以按任何顺序加载 A[i]B[i]F[i]

同理,如果可以判断G[i]不与C[i]重叠,则可以按任意顺序存储C[i]G[i]

如果此代码出现在循环中,则这种允许的重新排序会扩展到循环迭代之间的元素:如果编译器可以确定它不会影响定义的结果,它可以从“加载 B[i]例如,在为当前迭代加载 A[i] 之前。它可以从 B 加载四个元素,从 A 加载四个元素,从 F 加载四个元素,并在将任何元素存储到 C 或 [=31 之前执行所有算术运算=]. (通常编译器没有数组重叠的必要信息,所以它不会重新排序,除非你以某种方式给它这个信息,比如用 restrict 声明指针或使用特殊的 pragmas 或编译器内置-ins 告诉它这些事情。)

通常,C 标准对于实际操作的排序方式是宽松的。它只要求满足它指定的可观察行为。您不应期望仅根据标准 C 代码首先加载任何特定元素。