如何在给定的 CPU 多核芯片配置上并行化大型 MatMul?

问题描述

我最近在一个求职面试职位上被要求设计一个解决这个问题的方法。面试官说了一些关于它应该如何受内存限制而我的结果是计算绑定的。

从那以后我就糊涂了,我想我可能是遗漏了什么,或者面试官可能在计算中的某个地方犯了错误

鉴于此配置的 cpu

vector processing unit.
DRAM bw 100 GB/sec
LLC 2MB/core
L2 cache 0.25 MB/core
28 cores in the cpu
6000 GFlops total.

Matmul/Gemm 介于 2 个 1000x1000 的矩阵之间。 目标是尽可能快地运行这个 Gemm。您将如何解决这个问题?

我的计算:

Total compute to be done = 1000 * 1000 * 1000 MAC ops = 1 GFlops
Time take for compute = 1/6000 sec ~ 16ms

Total data transfer = size of matrix A,B and result = 3 * 1000 *1000 *4 bytes = 12 MBytes.
Time taken for data transfer = 12/100 ms = 0.12 ms

data-transfer time < compute-time 开始,我说这个操作是计算绑定的。采访说它应该是记忆所限。众所周知,Gemm/Matmul/Convolutions 是计算密集型操作,并且通常受计算限制。所以这让我很困惑。

关于如何利用 28 个内核,我认为可以通过将第一个 1000x1000 矩阵逐行拆分,以便 27 matrices are of size 36x10001 matrix of 28x1000 将给定 1000x1000 矩阵的 2 的 matmul 拆分为 28 个 matmul。 (1000-27*36 = 28)。 所以原来的matmul转化为:

27 matmuls of 36x1000 and 1000x1000 matrices
1 matmul of 28x1000 and 1000x1000 matrices

所以我的方法是在上面分成 28 个 matmul,并在每个较小的 matmul 上循环平铺。但面试官似乎并不满意。

问题 有人可以解释一下,在使用多线程的同时,您将如何理想地解决在 28 个内核上并行化 matmul 的问题?

我的回答是否有遗漏或面试官误认为它是内存绑定的?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)