Parallel processing 如何并行化需要额外索引的张量乘法迭代,或者在没有更多内存的情况下对其进行矢量化?

Parallel processing 如何并行化需要额外索引的张量乘法迭代,或者在没有更多内存的情况下对其进行矢量化?,parallel-processing,pytorch,gpu,vectorization,Parallel Processing,Pytorch,Gpu,Vectorization,我必须用Pytorch计算这个。但它在GPU上非常慢,实际上并不比CPU版本快 #n,k 10000000(1E7) #a形:(n,100)(1E9) #索引形状:(k,10)(1E8)用于选择 #w形:(k,10)(1E8) #结果形状:(k,100)(1E9) # #结果[i]=w[i,0]*a[index[i,0]]+…+w[i,9]*a[index[i,9]] 对于范围内的i(len(result)): 结果[i]=(w[i]。未查询(-1)*a[索引[i]])。和(0)#形(10,1)

我必须用Pytorch计算这个。但它在GPU上非常慢,实际上并不比CPU版本快

#n,k 10000000(1E7)
#a形:(n,100)(1E9)
#索引形状:(k,10)(1E8)用于选择
#w形:(k,10)(1E8)
#结果形状:(k,100)(1E9)
#
#结果[i]=w[i,0]*a[index[i,0]]+…+w[i,9]*a[index[i,9]]
对于范围内的i(len(result)):
结果[i]=(w[i]。未查询(-1)*a[索引[i]])。和(0)#形(10,1)(10,100)->(100)
要将其矢量化,一个简单的方法是删除
[i]

result=(w.unsqueze(-1)*a[索引]).sum(1)#shape(1E7,10,1)(1E7,10100)->(1E7,100)
这个版本很快。问题是,
a[index]
创建了一个形状张量
(k,10100),即(1E10)
,导致
CUDA内存不足。我只需要访问
a
,因此不需要额外的内存


那么,如何并行化for循环,或者如何解决向量化版本中的内存问题呢?

我真的看不到解决
a[index]
的方法。但是,您可以处理块,而不是一次处理一行的循环:

chunk=n//10#可以放入内存的最大块
结果=火炬。空((n,),数据类型=a.D类型,设备=a.D设备)
从=0开始
而从
to_uz=min(从_uz+chunk,n)
结果[从:到]=(w[从:到:]*a[索引[从:到:])。总和(0)
从到_