我有一个用于在 2 个数据库之间传输数据的应用程序。该应用程序的大部分操作都是独立的,并且是并发运行的。早些时候,这个应用程序在 4 核英特尔机器上运行,现在这个应用程序需要移植到 AMD 四(4)核机器上。我对以下几点表示怀疑。
我发现 AMD 不支持超线程(HTT),这显然意味着应用程序性能(吞吐量)会下降。上下文切换是否会导致性能下降,如果是,减少并发运行的线程数量会有所帮助吗?
我是否需要更改任何代码来提高应用程序吞吐量。
我有一个用于在 2 个数据库之间传输数据的应用程序。该应用程序的大部分操作都是独立的,并且是并发运行的。早些时候,这个应用程序在 4 核英特尔机器上运行,现在这个应用程序需要移植到 AMD 四(4)核机器上。我对以下几点表示怀疑。
我发现 AMD 不支持超线程(HTT),这显然意味着应用程序性能(吞吐量)会下降。上下文切换是否会导致性能下降,如果是,减少并发运行的线程数量会有所帮助吗?
我是否需要更改任何代码来提高应用程序吞吐量。
AMD 没有采用超线程,而是采用了与 Bulldozer 一样的替代路线,称为(某些)集群。
正如MinGW 带来的链接中所解释的,这意味着单个 AMD 内核现在可以支持 2 个整数“硬件线程”(很像 HT)+一个浮点专用线程。请注意,与在硬件线程之间共享所有核心资源的 HT 不同,此方案中仅共享前端(指令获取和解码)。后端是重复的,这意味着如果你是后端绑定的(执行花费了你大部分时间),你应该能够获得比 HT 高 2 倍的资源 BW,如果你是前端绑定的,则与 HT 大致相同(对于例如,您有一个具有多个分支的复杂控制流)。
请注意以下引用的内容几乎相同:
在其他条件相同的情况下,它应该为您提供比单个 SMT(超线程)内核更多的线程性能,但少于两个专用内核
因此,现在基本上每个硬件线程都不仅仅是一个英特尔硬件线程,而是一个完整的英特尔内核。您可以将其视为超级硬件线程或蹩脚的核心,具体取决于您的个人喜好。
然而,这是一个很大的“然而”,AMD 曾经在这里作弊 - 他们根据这些“超级”线程而不是实际组合(新称为“模块”)发布核心计数。这意味着 4 核 AMD 机器实际上有 2 个模块,有 4 个超级线程,因此硬件线程数与 2 核 Intel 机器相同(尽管线程更强),但 4 - 启用了 HT 的核心 Intel 机器。您没有指定您打算使用哪台机器,因此请确保核心数具有正确的含义。
正如我上面所说,性能可能会有所不同 - 对于执行密集型工作负载,您可能会在 4 核 AMD 和 4 核 Intel 之间看到类似的结果,因为您拥有相同数量的并行管道,而 HT 可能对 Intel 帮助不大(尽管“可能”在这里以非常广泛的意义使用 - 更好的比较将考虑每台机器上不同缓冲区的大小、并行 ALU 和端口的数量、问题宽度等。)。另一方面,在分支或内存密集型工作负载上,您往往会在等待数据/分支解析时陷入困境 - 英特尔可以并行引入额外的 4 个硬件线程,而无需任何上下文切换开销,从而完成更多工作。
Java 与硬件无关。您不应该关心 CPU 提供了哪些功能。
顺便说一句,对于大多数基准测试(5-10%),HTT 带来的性能提升总是非常有限。
请记住:不是每个制造商都有它,也不是每个处理器都有它。
就您的数据库的性能而言:您应该考虑最大化并行性并最小化上下文切换。
我个人认为 AMD 芯片对于多线程来说实际上是很有价值的。
Piledriver 架构的工作原理:http ://www.anandtech.com/show/3863/a...t-chips-2010/4