可伸缩性和加速之间的区别?

Difference between scalability and speedup?

我正在阅读我的并行系统课程的教科书,我发现了这两个流行的概念:

有人能告诉我区别吗?对我来说,Tseq 在语义上(实际上)等于 Tpar(1)

回答后更新:

我想我理解了其中的区别,但我还有一个问题:我正在优化 this 代码。为了使我的并行版本平衡良好,使用了近似结果。差异 非常 很小,可以忽略不计,但工作负载得到了极大的平衡,可扩展性也因此大大提高。

此外,我做了一些优化,比如使用原始指针而不是原始代码中使用的基于它们构建的数据结构(例如 cv::Mat)。

所以我的问题是:为了测量加速,我应该使用原始代码(我链接的代码)还是像作弊?

与顺序执行相比,并行度为 1 的并行执行仍然会产生一些开销。想象一下:

gcc code.c
./a.out

gcc code.c -fopenmp
OMP_NUM_THREADS=1 ./a.out

后者可能会比较慢,因为需要在每个并行部分执行代码,检查应生成的线程数。

与顺序代码相比,您甚至可能需要截然不同的并行代码实现。

关于您的修改:

最重要的是要清楚和诚实地比较你所比较的东西!我认为最好的方法是将一般优化的加速与并行化工作分开。如果您只有未优化的串行和优化的并行版本,请使用优化的并行版本,例如编译时未将 OpenMP 作为并行加速的基准。

Speedup 告诉您并行算法比顺序算法快多少。可扩展性告诉您并行算法的性能如何随着您添加硬件而变化。

注意这两个公式与what你比较并行算法的区别:在可扩展性公式中,你比较并行算法的性能与NCPUs 反对 本身 与 1 CPU。在加速公式中,您将 N CPUs 的并行算法的性能与 不同的算法(即算法的顺序版本)进行比较。