0

我正在尝试在单个处理器上实现阻塞(平铺)矩阵乘法。我已经阅读了有关为什么阻塞可以提高内存性能的文献,但我只是想问一下如何确定最佳块大小。我需要执行 C+A*B,其中 A、B、C 是相同维度的浮点方阵。3 个块应该一次放入缓存是有道理的,那么块大小应该是缓存大小除以 3 吗?或者块大小应该是别的东西吗?

最后,任何人都可以提出一种可行的实验方法来确定我正在使用的超级计算机上的最佳块大小吗?我正在使用 GCC C。

4

1 回答 1

2

我正在尝试在单个处理器上实现阻塞(平铺)矩阵乘法。

请注意,到 2021 年,大多数处理器都是多核的。您可能对POSIX pthreads感兴趣。参见pthreads(7)

我需要执行 C+A*B,其中 A、B、C 是相同维度的浮点方阵。3 个块应该一次放入缓存是有道理的,那么块大小应该是缓存大小除以 3 吗?

我不是专家,但我认为事情没有那么简单。CPU 缓存大小通常是 2 的幂,并且您有多个缓存级别。

阅读BLAS并考虑使用它。

最后,任何人都可以提出一种可行的实验方法来确定我正在使用的超级计算机上的最佳块大小吗?

我假设超级计算机运行 Linux,如果它被编译为插件,您可以使用一些GCC在其上编译 C 代码并执行它和dlopen(3)它。阅读 Drepper 的论文如何编写共享库以了解详细信息。

然后,在阅读time(7)之后,您可以编写一些 C 程序(受我的manydl.c启发),它生成各种不同的临时C 文件,使用不同的块大小定义 C 函数,编译 - 使用system(3) - 一些/tmp/generated1234.c文件gcc -O3 -Wall -shared -fPIC /tmp/generated1234.c -o /tmp/generated1234.sodlopen(3) that "/tmp/generated1234.so", dlsym(3)这些 C 函数,通过指针调用它们,并测量每个此类插件的 CPU 时间。

我需要执行 C+A*B,其中 A、B、C 是相同维度的浮点方阵。

或者,一些超级计算机具有OpenCL(或CUDA)实现。您可以学习 OpenCL(或 CUDA)并在 OpenCL(或 CUDA)中编写一些关键的数字内核例程,或者像生成 C 代码一样生成 OpenCL(或 CUDA)代码。

当然,您需要最新的GCC,例如2021 年春季的GCC 10。您可能想了解所有可能的优化标志,包括OpenACCOpenMP

我什至猜你可能会使用机器学习技术来找到最佳块大小......

另请阅读Open-MPI

请注意proc(5)/proc/cpuinfo中的记录

您还可以联系您所在国家和其他地方的其他超级计算机用户。天气预报组织(在法国,MeteoFrance),或在各个行业(汽车、国防、航空航天等)从事CAD的工程师会浮现在脑海中。CERN(甚至我的雇主CEA)或来自ITER(在欧洲)或LLNL(在美国)的人

于 2021-01-06T07:36:41.057 回答