小编Ada*_*lai的帖子

Python:如何编写此代码以在GPU上运行?

我已经尝试了很长时间来实现我的代码以在GPU上运行,但是收效甚微。我真的很感谢有人帮助实施。

让我谈谈这个问题。我有一个带有N个节点的图G,并且在每个节点x上都有一个分布mx。我想为所有边缘的每对节点计算分布之间的距离。对于给定的一对(x,y),我使用ot.sinkhorn(mx, my, dNxNy)python POT包中的代码来计算距离。同样,mx,my是节点x和y上大小为Nx和Ny的向量,而dNxNy是Nx x Ny距离矩阵。

现在,我发现此代码有一个GPU实现ot.gpu.sinkhorn(mx, my, dNxNy)。但是,这还不够好,因为我mx,my和dNxNy在每次迭代时都需要上载到GPU,这是一笔巨大的开销。因此,我们的想法是针对GPU的所有边缘对此进行并行化。

代码的实质如下。mx_all是所有发行版

for i,e in enumerate(G.edges):
    W[i] = W_comp(mx_all,dist,e)

def W_comp(mx_all, dist,  e):
    i = e[0]
    j = e[1]

    Nx = np.array(mx_all[i][1]).flatten()
    Ny = np.array(mx_all[j][1]).flatten()
    mx = np.array(mx_all[i][0]).flatten()
    my = np.array(mx_all[j][0]).flatten()

    dNxNy = dist[Nx,:][:,Ny].copy(order='C')

    W = ot.sinkhorn2(mx, my, dNxNy, 1)
Run Code Online (Sandbox Code Playgroud)

以下是一个最小的工作示例。请忽略除虚线===符号之间的所有内容。

import ot
import numpy as np
import scipy as sc


def main():
    import networkx as nx

    #some example graph
    G = nx.planted_partition_graph(4, 20, 0.6, …
Run Code Online (Sandbox Code Playgroud)

parallel-processing gpu vectorization gpu-programming numba

7
推荐指数
1
解决办法
244
查看次数

矩阵代数用C++

我想问一下数组的数学运算.我主要对执行以下操作感兴趣:

矢量产品:

C=A+B
C=A*B
Run Code Online (Sandbox Code Playgroud)

其中A和B是数组(或向量),和

矩阵产品:

D=E*F; 
Run Code Online (Sandbox Code Playgroud)

其中D [m] [n],E [m] [p],F [p] [n];

谁能告诉我操作大量数字的最有效方法是什么?它是否只能通过循环遍历数组的元素或是否有另一种方式?可以使用向量以及如何使用?

c++ arrays product algebra

3
推荐指数
1
解决办法
1332
查看次数