我有一个C程序,它必须使用OpenMP库来实现。它的结构是:
for (t = 0; t < IT; ++t) {
#pragma omp parallel for private(i, j, k, l) schedule(dynamic)
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
for (k = 0; k < n; ++k) {
for (l = 0; l < n; ++l) {
// calculations 0
}
}
// calculations 1
}
}
#pragma omp parallel for private(i, j) schedule(dynamic)
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
// calculations 2
}
}
}这个程序在一个矩阵上做一些计算。计算2必须在计算0和1完成之后进行,因为它在矩阵中做了一些修改。
问题是加速非常糟糕,即程序不可伸缩。给定输入的串行版本运行时间为79.46秒。当运行两个线程时,它在41秒内完成,几乎完美地加速了1.93倍,但当运行3个线程时,它在37.86秒内完成(加速比仅为2.1倍),而运行4个线程时,它需要34.104秒(加速比仅为2.3倍)。
为什么这是不可伸缩的?
PS。我有一台4核的英特尔i5 430M。
发布于 2012-11-03 01:50:34
由于您使用的是英特尔酷睿I5,因此它的可扩展性较差。英特尔酷睿I5有2个核心和4个线程,因此只有2个真正的核心,而不是4个。(该类型的处理器使用超线程技术)
具有2个核心和2个线程的处理器(例如,双核、酷睿2双核、核心I3)与您的核心I5 (具有2个核心和4个线程,并使用超线程来充当四核处理器)之间的区别在于,您的超线程核心I5 的性能提升最高可达30%。但您不能将超线程核心I5与核心I7 (具有4个核心和4个线程)进行比较。
https://stackoverflow.com/questions/13199384
复制相似问题