我正在尝试在单个处理器上实现分块(平铺)矩阵乘法。我已经阅读了关于为什么阻塞可以提高内存性能的文献,但我只是想问一下如何确定最佳的块大小。我需要执行C+A*B,其中A,B,C是相同维度的浮点方阵。3个块应该一次放入缓存中是有道理的,那么块大小应该是缓存大小除以3吗?或者块大小应该是其他值?
最后,有人能提出一个可行的实验方法来确定我正在使用的超级计算机上的最佳块大小吗?我正在和GCC C一起工作。
发布于 2021-01-06 15:36:41
我正在尝试在单个处理器上实现分块(平铺)矩阵乘法。
请注意,在2021年,大多数处理器都是multi-core。你可能会对POSIX pthreads感兴趣。参见pthreads(7)。
我需要执行C+A*B,其中A,B,C是相同维数的浮点方阵。3个块应该一次放入缓存中是有道理的,那么块大小应该是缓存大小除以3吗?
我不是专家,但我不认为这是那么简单。CPU cache大小通常是2的某个幂,并且您有多个缓存级别。
阅读有关BLAS的文章并考虑使用它。
最后,有没有人能提出一个可行的实验方法来确定我正在使用的超级计算机上的最佳块大小?
我假设超级计算机运行Linux,如果它被编译成一个GCC,你可以用一些plugin在它上面编译C代码,并执行它和dlopen(3)它。有关详细信息,请阅读Drepper的论文。
然后,在读完time(7)之后,你可以写一些C程序(受我的manydl.c的启发),它生成各种不同的临时C文件,使用不同的块大小定义C函数,用gcc -O3 -Wall -shared -fPIC /tmp/generated1234.c -o /tmp/generated1234.so编译-using system(3)-一些/tmp/generated1234.c文件,dlopen(3) /tmp/generated1234.c,dlsym(3)这些C函数,通过指针调用它们,并测量每个这样的插件的CPU时间。
我需要执行C+A*B,其中A,B,C是相同维数的浮点方阵。
或者,一些超级计算机具有OpenCL (或CUDA)实现。您可以学习OpenCL (或CUDA)并在OpenCL (或CUDA)中编写一些关键的数值内核例程,或者生成OpenCL (或CUDA)代码,就像生成C代码一样。
当然你想要一个最近的GCC,例如2021年春天的GCC 10。您可能想要阅读所有可能的optimization flags,包括OpenACC和OpenMP
我甚至猜测您可能会使用machine learning技术来找到最佳的块大小...
另请阅读Open-MPI
注意proc(5)中记录的/proc/cpuinfo
你也可以联系你的国家和其他地方的其他超级计算机用户。Weather forecasting组织(在法国,MeteoFrance),或在各个行业从事CAD工作的工程师(汽车、国防、航空航天等)出现在脑海中。或者CERN (甚至是我的雇主CEA),或者来自ITER (在欧洲)或LLNL (在美国)的人
https://stackoverflow.com/questions/65591380
复制相似问题