我有一个关于我的核心i7 920的FP峰值性能的问题.我有一个应用程序执行大量的MAC操作(基本上是卷积操作),我无法通过一个因素达到CPU的峰值FP性能当使用多线程和SSE指令时,大约是8倍.当试图找出原因是什么时,我最终得到了一个简化的代码片段,在单个线程上运行而不使用同样糟糕的SSE指令:
for(i=0; i<49335264; i++)
{
data[i] += other_data[i] * other_data2[i];
}
Run Code Online (Sandbox Code Playgroud)
如果我是正确的(数据和other_data数组都是FP),这段代码需要:
49335264 * 2 = 98670528 FLOPs
Run Code Online (Sandbox Code Playgroud)
它执行时间约为150毫秒(我非常确定这个时间是正确的,因为C计时器和英特尔VTune Profiler给出了相同的结果)
这意味着此代码段的性能如下:
98670528 / 150.10^-3 / 10^9 = 0.66 GFLOPs/sec
Run Code Online (Sandbox Code Playgroud)
这个CPU的峰值性能应该是2*3.2 GFlops/sec(2 FP单元,3.2 GHz处理器)对吗?
这个巨大的差距有什么解释吗?因为我无法解释它.
非常感谢,我真的可以使用你的帮助!
汇编程序中的代码循环是更快/更慢/更慢,然后只是编写指令x次,需要什么?还是代码依赖?但是什么时候机器执行二进制文件的速度更快:如果16位CPU直接读取16位或者返回32位?
最后; 是什么意思在asm循环?
告诉我哪一个更快:sub或者mul?
我的目标平台是X86; FPU和SSE.
例:
'LerpColorSolution1'使用乘法.
'LerpColorSolution2'使用减法.
哪个更快?
void LerpColorSolution1(const float* a, const float* b, float alpha, float* out)
{
out[0] = a[0] + (b[0] - a[0]) * alpha;
out[1] = a[1] + (b[1] - a[1]) * alpha;
out[2] = a[2] + (b[2] - a[2]) * alpha;
out[3] = a[3] + (b[3] - a[3]) * alpha;
}
void LerpColorSolution2(const float* a, const float* b, float alpha, float* out)
{
float f = 1.0f - alpha;
out[0] = …Run Code Online (Sandbox Code Playgroud) 我想知道为什么像这样的简单循环无法达到我的 CPU 时钟速度(4,2Ghz):
float sum = 0;
for (int i = 0; i < 1000000; i+=1) {
sum = sum * 1 + 1;
}
Run Code Online (Sandbox Code Playgroud)
凭直觉,我希望在不到 1 毫秒(例如 0,238 毫秒)的时间内实现这一目标,每秒进行 42 亿次迭代。但我得到的时间约为 3 毫秒,即每秒约 3.33 亿次迭代。
我假设做数学运算需要 2 个周期,一个用于乘法,另一个用于求和。假设我正在执行 6.66 亿次操作……看起来仍然很慢。然后我假设循环比较需要一个周期,循环计数器需要另一个周期......
所以我创建了以下代码来删除循环......
void listOfSums() {
float internalSum = 0;
internalSum = internalSum * 1 + 1;
internalSum = internalSum * 1 + 1;
internalSum = internalSum * 1 + 1;
internalSum = internalSum * 1 + 1;
// Repeated 100k …Run Code Online (Sandbox Code Playgroud) 我想在工作的新计算机上强调处理器.我认为一个好方法是用每个处理器为这个函数打开一个线程:
void soStressful() {
int j = 0;
for (int i = 0; i < 10000; ++i) {
j += i;
}
}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,编译器将此代码移除.(因为无论计算的复杂程度或i的大小,程序都会立即运行,并且我们也记录了很少的CPU使用率.
如何停止编译器编译此代码?
c++ compiler-construction multithreading for-loop compiler-optimization
假设我更改了一个单词中的一位并添加了另外两个单词。
更改字中的一位是否比更改整个字消耗更少的 CPU 周期?
如果它消耗更少的 CPU 周期,它会快多少?
我对群集上运行的实际应用程序性能与群集峰值性能有疑问.
假设一个HPC集群报告它的峰值性能为1 Petaflops.这是怎么计算的?对我来说,似乎有两个测量矩阵.一个是基于硬件计算的性能.另一个是运行HPL?我的理解是否正确?当我正在全面阅读系统上运行的一个真实应用程序时,开发人员提到它可以达到峰值性能的10%.这是如何测量的以及为什么它无法达到最佳性能?
谢谢