相关疑难解决方法(0)

为什么我的应用程序无法达到核心i7 920峰值FP性能

我有一个关于我的核心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处理器)对吗?

这个巨大的差距有什么解释吗?因为我无法解释它.

非常感谢,我真的可以使用你的帮助!

c compiler-construction sse intel

3
推荐指数
1
解决办法
611
查看次数

循环ASM更快?

汇编程序中的代码循环是更快/更慢/更慢,然后只是编写指令x次,需要什么?还是代码依赖?但是什么时候机器执行二进制文件的速度更快:如果16位CPU直接读取16位或者返回32位?

最后; 是什么意思在asm循环?

assembly

3
推荐指数
1
解决办法
308
查看次数

FPU,SSE单浮点.哪个更快?sub或mul

告诉我哪一个更快: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)

c c++ floating-point assembly

3
推荐指数
1
解决办法
571
查看次数

为什么 CPU 不能在一个简单的循环中实现相当于 Ghz 的 FLOP 性能?

我想知道为什么像这样的简单循环无法达到我的 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)

c cpu assembly

3
推荐指数
1
解决办法
312
查看次数

代码被编译器窃取,我该如何规避其犯罪方式

我想在工作的新计算机上强调处理器.我认为一个好方法是用每个处理器为这个函数打开一个线程:

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

1
推荐指数
2
解决办法
330
查看次数

更改一位每字节消耗的周期是否比对整个处理器字进行加/减/异或运算要少?

假设我更改了一个单词中的一位并添加了另外两个单词。

更改字中的一位是否比更改整个字消耗更少的 CPU 周期?

如果它消耗更少的 CPU 周期,它会快多少?

cpu energy cpu-cycles cpu-architecture

1
推荐指数
1
解决办法
84
查看次数

应用性能与峰值性能

我对群集上运行的实际应用程序性能与群集峰值性能有疑问.

假设一个HPC集群报告它的峰值性能为1 Petaflops.这是怎么计算的?对我来说,似乎有两个测量矩阵.一个是基于硬件计算的性能.另一个是运行HPL?我的理解是否正确?当我正在全面阅读系统上运行的一个真实应用程序时,开发人员提到它可以达到峰值性能的10%.这是如何测量的以及为什么它无法达到最佳性能?

谢谢

hpc supercomputers

0
推荐指数
1
解决办法
960
查看次数