【发布时间】:2016-11-15 13:51:15
【问题描述】:
使用 OpenMP,我在不同的线程中划分了一个简单的算法,但执行时间急剧增加。这可能是由于所有线程都在同一个 CPU 内核上运行。我知道,如果我的 CPU 是双核或四核,那么分配的线程数多于 CPU 核数将无济于事。但即使有两个线程,执行时间也在增加。
【问题讨论】:
-
您可以绑定告诉 OpenMP 不要移动线程的线程,但 OpenMP,至少在我上次查看它时(在 OpenMP 4.0 之前),没有提供将特定线程分配给粒子的方法核。如果你绑定线程,你就会陷入在启动代码时定义的任何拓扑结构中。您必须使用非 OpenMP 函数来说明哪些线程绑定到特定内核。
-
至少在 Windows 上使用超线程,默认拓扑将前两个线程放在同一个核心上,这显然不理想。我认为 Linux 和 Windows 上的 AMD 模块也会发生同样的事情(第一个模块上的前两个线程)。 AMD 模块实际上只是一个浮点内核。如果您只使用 Intel 和 AMD 的默认线程数,这通常不是问题,因为所有内核都会被填满,但如果您使用更少的线程,那么逻辑处理器的数量可能不会像您预期的那样扩展。
-
为什么要控制线程数?为什么不直接使用默认值?
-
整个问题是基于完全没有根据的假设,即您的线程在同一个 CPU 内核上运行。第一步只能是详细展示你是如何得出这个结论的,提供必要的信息来重现或理解这个问题。问题中绝对没有任何内容可以作为起点。这里的所有讨论都是完全假设的。
标签: c multithreading performance parallel-processing openmp