【发布时间】:2023-03-31 20:55:01
【问题描述】:
UPD:原始形式的问题表述不当,因为我严重混淆了术语(SIMD 与矢量化计算),并给出了过于宽泛的示例,无法准确说明问题所在; 我投票关闭它“不清楚你在问什么”,只要它出现,我会在上面链接一个更好的问题
在数学中,人们通常会使用索引符号来描述 n 维张量计算,如下所示:
A[i,j,k] = B[k,j] + C[d[k],i,B[k,j]] + d[k]*f[j] // for 0<i<N, 0<j<M, 0<k<K
但是如果我们想使用任何 SIMD 库来有效地并行化该计算(并利用线性代数魔法),我们将不得不使用来自BLAS、numpy、tensorflow、@ 的原语来表达它987654325@、... 这通常很棘手。
像A_ijk*B_kj 这样的[爱因斯坦符号][1] 表达式通常通过[np.einsum][2] 求解(我猜是使用tensordot、sum 和transpose?)。求和和其他元素操作也可以,但是“智能”索引非常棘手(特别是,如果索引在表达式中出现的次数超过一次)。
我想知道是否有任何与语言无关的库以某种形式(比如说,上面的形式)将表达式转换为可以使用现有线性代数库有效执行的Intermediate Representation?
有些库试图并行化循环计算(用户 API 通常看起来像 C++ 中的 #pragma 或 python 中的 @numba.jit),但我问的是稍微不同的事情:将上面形式的 abritary 表达式转换为有限SIMD 命令序列,如 elementwise-ops、matvecs、tensordots 等。
如果还没有与语言无关的解决方案,我个人对 numpy 计算很感兴趣 :)
【问题讨论】:
-
我问这个问题有什么问题?答案“不,这是不可能的,因为 X”也是一个可以接受的答案 :) 如果存在那种库\算法(而且我并不孤单),我会非常高兴。如果问题形式本身很难看,我会重新提出问题。
-
你能用 C 或某种伪代码写一个循环,清楚地表达你想要向量化的计算类型吗?我不确定我是否理解您的
{}符号。但是,如果它类似于矩阵乘法,是的,转置其中一个输入通常非常有用,因此您需要连续结果的数据连续存储在两个源中。 -
@PeterCordes 感谢您的评论!我同意,我已经更新了问题,现在符号看起来不那么模棱两可了吗?
-
另外,为什么
i没有出现在右侧?相同的数据是否重复N次?? -
(我的 cmets 正在成为答案,所以我就这样发布了)
标签: numpy math tensorflow linear-algebra simd