我正在使用CUDA批量执行大量3x3矩阵。
目标是得到一个3x3矩阵的大矩阵(所以我使用4D数组)。
我以前使用numpy.linalg.inv
函数完成了相同的操作。这样,我可以直接得到一个3x3矩阵数组:我向您展示执行此操作的代码。
现在,在CUDA版本中,我想以最少的指令重塑所生成的大1D数组:因此,我必须从(N * N * 3 *)构建一个(N,N,3,3)数组3)一维阵列。
目前,我可以将其重塑为2个步骤(此处为下面的代码)。
带有经典numpy.linalg.inv
的原始版本由:
for r_p in range(N):
for s_p in range(N):
# original version (without GPU)
invCrossMatrix[:,:,r_p,s_p] = np.linalg.inv(arrayFullCross_vec[:,:,r_p,s_p])
invCrossMatrix
表示一个(3,3,N,N)数组,我直接从(3,3,N,N)arrayFullCross
数组(dimBlocks = 3
)中得到它< / p>
目前,当我使用GPU批处理执行时,我从1D数组开始:
# Declaration of inverse cross matrix
invCrossMatrix_temp = np.zeros((N**2,3,3))
# Create arrayFullCross_vec array
arrayFullCross_vec = np.zeros((3,3,N,N))
# Create arrayFullCross_vec array
invCrossMatrix_gpu = np.zeros((3*3*(N**2)))
# Build observables covariance matrix
arrayFullCross_vec = buildObsCovarianceMatrix3_vec(k_ref, mu_ref, ir)
## Performing batch inversion 3x3 :
invCrossMatrix_gpu = gpuinv3x3(arrayFullCross_vec.flatten('F'),N**2)
## First reshape
invCrossMatrix_temp = invCrossMatrix_gpu.reshape(N**2,3,3)
# Second reshape : don't forget ".T" transpose operator
invCrossMatrix = (invCrossMatrix_temp.reshape(N,N,3,3)).T
问题1)::为什么必须将-F
中的flatten('F')
选项设置为?
如果我只做gpuinv3x3(arrayFullCross_vec.flatten,N**2)
,则代码不起作用:Python可能像Fortran一样是专栏的?
问题2) 现在,我想转换以下块:
## First reshape
invCrossMatrix_temp = invCrossMatrix_gpu.reshape(N**2,3,3)
# Second reshape : don't forget ".T" transpose operator
invCrossMatrix = (invCrossMatrix_temp.reshape(N,N,3,3)).T
转换为单个重塑指令:可以吗?
问题是要将一维数组invCrossMatrix_gpu
(N ** 2 * 3 * 3)直接转换为(3,3,N,N)数组。
由于我多次调用这些例程,我希望仅一次重塑原始一维数组。
更新1:正确地说是由
定义的数组inVCrossMatrix
invCrossMatrix = (invCrossMatrix_temp.reshape(N,N,3,3)).T
具有尺寸(3,3,N,N)。
@hpaulj:等同于do:
invCrossMatrix =(invCrossMatrix_temp.reshape(N,N,3,3)).transpose(2,3,0,1)
??问候