1

我有一个奇怪的问题,也许你们中的一个人知道那里发生了什么。

我正在处理的代码是一个冗长而复杂的模拟代码。我有一个函数 matrixSetup ,它在开始时被调用并且我在其中测量运行时间。在设置了我的矩阵并做了很多其他事情之后,我正在运行我的求解器等等。

现在我在求解器代码上进行了一些更改,这不应该影响矩阵设置的运行时间。但是,我看到那里从 90 秒增加到 150 秒。无需触及那段代码。为什么?如何?

这个时间差是完全可重现的。撤消求解器中的更改会返回快速矩阵设置。在求解器中进行其他更改可能会也可能不会导致运行时间的相同增加,所有这些都是可重现的。运行是在一个空的计算节点上以隔离的方式进行的,因此不会受到那里的影响。

当使用 vTune 找出运行时间增加的地方时,我最终得到了一个简单的循环(在循环嵌套中):

for (l = 0; l < nrConnects; l++)
    if (connectedPartitions[l] == otherParti) {
        nrCommonCouplNodes[l]++; 
        pos = l; 
        break;
    }

有人知道那里发生了什么吗?编译器生成的指令与 vTune 完全相同。我正在使用 Intel 编译器,版本 19.0.1。

我正在玩一些编译器标志。当声明 -fpic (确定编译器是否生成与位置无关的代码)时,运行时的增加消失了。但我认为,这会导致指令略有不同,因此并不能解决我面临的真正问题。

使用 Clang,我看不到(至少在这里)这种行为......

关于增加运行时间的原因有什么想法吗?我很好奇...

干杯迈克尔

4

1 回答 1

2

我现在使用 -mbranches-within-32B-boundaries 进行了测试,并且相同的代码现在获得了快速的运行时间(在其他一些地方,代码现在也更快了)。该标志是英特尔在一份关于 JCC 勘误表的文件中提出的。感谢 Peter Cordes 向我指出这一点。希望它不仅能对抗症状,还能真正治愈问题。

于 2021-08-23T09:44:17.137 回答