Numpy 在一般情况下,如何将索引表示法中的计算转换为SIMD ops序列?

Numpy 在一般情况下,如何将索引表示法中的计算转换为SIMD ops序列?,numpy,math,tensorflow,linear-algebra,simd,x86,Numpy,Math,Tensorflow,Linear Algebra,Simd,X86,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 A[i,j,k]=B[k,j]+C

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

A[i,j,k]=B[k,j]+C[d[k],i,B[k,j]+d[k]*f[j]//对于0关于代码的更多问题:

  • 我看到
    B[k,j]
    被用作索引和值。一切都是整数吗?如果不是,哪些部分是FP,转换在哪里发生
  • 为什么
    i
    不出现在右侧?相同的数据是否重复N次

哦,是的,你有一个聚集操作,索引来自
d[k]
B[k,j]
。只有少数SIMD指令集支持此功能(例如AVX2)

我主要是用C语言手动矢量化(或自动矢量化,并检查编译器的asm输出以确保它不糟糕),所以IDK是否有任何平台无关的方式来表示该操作

我不希望许多跨平台的SIMD语言会提供一个聚集或任何构建在聚集之上的东西。不过我还没用过numpy。 我不希望您会找到包含gather的BLAS、LAPACK或其他库函数,除非您寻找这个确切问题的实现

使用有效的聚集(例如Intel Skylake或Xeon Phi),如果在
j
上使用SIMD循环,它可能会矢量化为ok,因此您可以从
B[]
f[]
立即加载整个矢量,并将其与保持
d[k]
广播到每个位置的矢量一起使用。您可能想要存储一个转置的结果矩阵,比如
a[i][k][j]
,这样最终的存储就不必是分散的。您肯定需要避免在最内部的循环中循环
k
,因为这会使来自
B[]
的加载不连续,并且
d[k]
而不是
f[j]
在内部循环中变化


我对GPGPU做的不多,但它们对SIMD的处理方式不同。它们实际上将许多标量处理器组合在一起,而不是像CPU那样使用短向量。OpenCL或CUDA或任何其他热门的新GPGPU技术可能会更有效地处理您的聚集


SIMD命令,如elementwise ops、matvecs、tensordots等

当我想到“SIMD命令”时,我想到汇编指令(或ARM氖,或任何东西),或者至少是编译到单个指令的C/C++内联函数。P

矩阵向量积不是一条“指令”。如果使用该术语,则处理缓冲区的每个函数都将是“SIMD指令”

您问题的最后一部分似乎要求提供一个独立于编程语言的numpy版本,用于将高性能库函数粘合在一起。或者,您是否认为可能有某种东西可以对这些操作进行内部优化,这样您就可以编写一些东西来编译成一个向量化循环,这样就可以多次使用每个输入,而不必在单独的库调用中重新加载它


IDK,除了正常的C编译器对数组上的循环进行自动矢量化之外,还有什么类似的问题吗?答案“不,这是不可能的,因为X”也是一个可以接受的答案:)如果有这样的库\算法存在的话,我会非常高兴(我并不孤单)。为了防止问题形式本身很难看,我重新设计了一个问题。你能用C写一个循环,或者用某种伪代码来清楚地表达你想要向量化的计算类型吗?我不确定我是否理解你的
{}
符号。如果它类似于矩阵乘法,是的,转置一个输入通常非常有用,以便连续结果所需的数据连续存储在两个源中。@PeterCordes感谢您的评论!我同意,我已经更新了这个问题,现在符号看起来不那么模棱两可了吗?还有,
I
为什么不出现在右边?相同的数据是否重复了
N
次??(我的评论变成了答案,所以我就这样发布了它们)是的,让我们假设它们都是整数;这不是一个实际问题,我只是想说明表达式包括聚集、乘法和和;实际上我只对
收集
部分感兴趣;我所说的
SIMD
是指所有在大量数据中执行“类似操作”(即元素操作、向量操作、聚集等)的操作,这可能是我这边术语上的混淆,是吗?你的回答确实非常详细和有帮助,它回答了我提出的问题(问题是,在当前的表述中,它问的不是我最初想知道的:)-我不想改变这个问题,让你的答案过时(因为你的答案很棒!),你不介意我现在接受它,并在它出现时链接一个新的、表述更好的问题吗?我的问题基本上是“给定一个复杂的聚集语句,如
result[i,j,k]=a[B[i,j],k,c[i]]
——如何将其自动转换为智能索引表达式(对于numpy)或一系列转置、重塑和1d聚集(对于tensorflow)“,因为每次我需要编写类似的代码时,我都会花一些时间重新发明如何重塑\转换数据以获得所需的结果;我通常最后都会成功,但我希望我能写一些像
result[I,j,k]=..
(上图)@BenUsman:是的,有一些