c-确定块矩阵乘法的最佳块大小



我正试图在单个处理器上实现分块(平铺(矩阵乘法。我读过关于为什么块可以提高内存性能的文献,但我只是想问如何确定最佳块大小。我需要执行C+A*B,其中A、B、C是相同维度的浮点平方矩阵。3个块应该同时放入缓存是有道理的,那么块大小应该是缓存大小除以3吗?还是块的大小应该是其他的?

最后,有人能提出一种可行的实验方法来确定我正在使用的超级计算机上的最佳块大小吗?我在GCC C.工作

我正试图在单个处理器上实现分块(平铺(矩阵乘法。

请注意,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函数,使用系统(3(编译一些具有gcc -O3 -Wall -shared -fPIC /tmp/generated1234.c -o /tmp/generated1234.so/tmp/generated1234.c文件,该"/tmp/generated1234.so"的dlopen(3(,dlsym(3(这些C函数,通过指针调用它们,并测量每个此类插件的CPU时间。

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

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

当然,你想要一个最近的GCC,例如2021年春季的GCC 10。你可能想了解所有可能的优化标志,包括OpenACC和OpenMP

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

另请阅读有关Open MPI 的信息

注意过程(5(中记录的/proc/cpuinfo

你也可以联系你所在国家或其他地方的其他超级计算机用户。天气预报机构(在法国,MeteoFrance(或在各个行业(汽车、国防、航空航天等(从事CAD的工程师会想到。或者CERN(甚至我的雇主CEA(或ITER(欧洲(或LLNL(美国(的人员

相关内容

  • 没有找到相关文章

最新更新