#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define N 30000
int a[N][N] = { 0 };
int main() {
srand(time(NULL));
int sum = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
a[i][j] = rand() % 99;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sum += a[i][j];
}
}
}
在我的系统上,行-主顺序访问平均花费8.42s
(n=5
试用),而列-主顺序访问在我的系统上花费30.12s
(n=5
试用),这是相当重要的。
从表面上看,这应该是一件非常简单的事情来优化。
为什么现代编译器不优化这些场景?
大多数循环不是由简单的和语句组成,而是有副作用和循环迭代之间的依赖关系。
不是循环中的所有操作都是交换的,所以优化器必须真正理解循环中发生的所有操作,以确保它不会改变其含义,包括调用的任何系统API的内容、动态加载库中的代码等。
现在这只是一个猜测,但我希望有人尝试过,意识到优化没有足够的关于正在运行的代码的信息来触发大多数次,然后关注并行执行优化,这可能是大多数代码库中更大的优化机会。
为了更好地理解编译器,特别是汇编语言,我一直在实验一段简单的代码,其中计算第一个数字的总和,这应该导致或. 如代码所示,有两个功能: 在第一个函数中,I从O循环到N,即
(这个问题与此密切相关,但它是一个更具体的问题,我希望能就此得到答案)
这是CppCon谈话中的一个例子https://www.youtube.com/watch?v=F6Ipn7gCOsY 目标是首先从A打印Hello,然后允许线程B启动。很明显,应该避免繁忙等待,因为它占用大量CPU。 作者说, 循环可以由编译器进行优化(通过将 的值放入寄存器中),因为编译器看到 从不Hibernate,因此永远不会被更改。但是,即使线程从不Hibernate,另一个线程仍然可以
问题内容: 这段代码使我凝视了几分钟: (这里的第137行) 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 它不是一个keyword,而是一个label。 用法:
考虑以下代码: