相关疑难解决方法(0)

SIMD是否必须在多核CPU上实现?

SIMD是否必须在多核CPU上实现?在阅读有关SIMD的Wikipedia时,我发现以下短语“多个处理元素”,那么该短语与“多核CPU”有什么区别?

在此处输入图片说明

cpu simd

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

什么是WAW危害?

维基百科的危害(计算机体系结构)文章:

写后写(WAW)(i2试图在写操作数之前写操作数i1)在并发执行环境中可能发生写后写(WAW)数据危险。

示例例如:

i1. R2 <- R4 + R7   
i2. R2 <- R1 + R3   
Run Code Online (Sandbox Code Playgroud)

的写回(WB)i2必须延迟到i1完成执行为止。

我还不明白

如果i2执行之前有i1什么问题?

assembly pipeline cpu-architecture microprocessors

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

必须按顺序发生的操作的处理器的延迟界限和吞吐量界限

我的教科书(计算机系统:程序员的观点)指出,当一系列操作必须严格按顺序执行时,就会遇到延迟界限,而吞吐量界限则表征​​处理器功能单元的原始计算能力。

课本5.5、5.6题介绍了这两种可能的多项式计算循环结构

double result = a[0];
double xpwr = x;
for (int i = 1; i <= degree; i++) {
    result += a[i] * xpwr;
    xpwr = x * xpwr;
}
Run Code Online (Sandbox Code Playgroud)

double result = a[degree];
double xpwr = x;
for (int i = degree - 1; i >= 0; i--) {
    result = a[i] + x * result;
}
Run Code Online (Sandbox Code Playgroud)

假设循环在具有以下执行单元的微体系结构上执行:

  • 一个浮点加法器。它的延迟为 3 个周期,并且是完全流水线化的。
  • 两个浮点乘法器。每个的延迟是 5 个周期,并且都是完全流水线化的。
  • 四个整数 ALU,每个都有一个周期的延迟。

为这个问题给出的浮点乘法和加法的延迟界限分别是 5.0 和 3.0。根据答案键,第一个循环的总循环延迟是每个元素 5.0 个周期,第二个是每个元素 8.0 个周期。我不明白为什么第一个循环不是 8.0。

似乎 a[i] …

performance cpu-architecture micro-optimization

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

如果 CPU 频率不增加,那么 CPU 对于非并行代码如何更快?

CPU 仍在“改进”,但在过去 10 年里它们的频率并没有提高很多。

我可以理解晶体管数量随着晶体管越来越小而增加,但我不明白如果频率降低,非并行程序(我认为大多数程序都是非并行的?)如何在新 CPU 上执行得更快不增加。

我可以理解为什么 GPU 使用更多晶体管可以更快,因为它们是并行处理器(这个术语正确吗?)并且它们只执行并行代码。

但大多数软件都是非并行的,所以对我来说,新的 CPU 似乎不会比以前的 CPU 快很多,除非大多数程序可以并行化,但事实并非如此(我不确定,但是可以并行化的典型算法是什么?不并行吗?)。

更大的 L1/L2/L3 缓存大小是否可以让新 CPU 更快?或者还有其他东西,例如新指令或分支东西?

我缺少什么?

parallel-processing cpu performance cpu-architecture

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

是什么让 numpy.sum 比优化(自动向量化)C 循环更快?

我正在尝试编写一个与numpy.sum双精度数组一样快的 C 程序,但似乎失败了。

以下是我衡量 numpy 性能的方法:

import numpy as np
import time

SIZE=4000000
REPS=5

xs = np.random.rand(SIZE)
print(xs.dtype)

for _ in range(REPS):
    start = time.perf_counter()
    r = np.sum(xs)
    end = time.perf_counter()
    print(f"{SIZE / (end-start) / 10**6:.2f} MFLOPS ({r:.2f})")
Run Code Online (Sandbox Code Playgroud)

输出是:

float64
2941.61 MFLOPS (2000279.78)
3083.56 MFLOPS (2000279.78)
3406.18 MFLOPS (2000279.78)
3712.33 MFLOPS (2000279.78)
3661.15 MFLOPS (2000279.78)
Run Code Online (Sandbox Code Playgroud)

现在尝试在 C 中做类似的事情:

float64
2941.61 MFLOPS (2000279.78)
3083.56 MFLOPS (2000279.78)
3406.18 MFLOPS (2000279.78)
3712.33 MFLOPS (2000279.78)
3661.15 MFLOPS (2000279.78)
Run Code Online (Sandbox Code Playgroud)

编译并gcc -o main …

c floating-point numpy avx compiler-optimization

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

x86-64处理器中没有足够的寄存器

我们在x86-64处理器中有16个通用寄存器:RAX,RCX,RDX,RBX,RSP,RBP,RSI,RDI,R9-15.x86-64处理器为我们提供了其他类型的寄存器.我的问题是:

  1. 我需要使用32个寄存器作为通用寄存器.可能吗.怎么样?
  2. 我听说x86-64处理器有更多通用寄存器,但它们没有命名.只有16个命名寄存器.那么,这是真的吗?是否可以使用它们?

assembly x86-64

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