多核编程

问题描述 投票:0回答:3

[我正在实习的公司被告知使用多核编程,鉴于我正在为自己的论文开发一个项目(我不是来自该地区,而是在从事一些涉及编码)。

我想知道是否可行:我有一个已定义的函数,将对3个不同的变量重复3倍。是否可以将3个同时运行在不同的内核中(因为它们不需要彼此的信息)?因为所有这些计算过程都是相同的,而不是一次运行1个变量,所以我想一次运行所有3个变量(一次执行所有计算),最后返回结果。

我想优化的某些部分:

for v in [obj2_v1, obj2_v2, obj2_v3]:
    distancia_final_v,       \
    pontos_intersecao_final_v = calculo_vertice( obj1_normal,
                                                 obj1_v1,
                                                 obj1_v2,
                                                 obj1_v3,
                                                 obj2_normal,
                                                 v,
                                                 criterio
                                                 )

def calculo_vertice( obj1_normal,
                     obj1_v1,
                     obj1_v2,
                     obj1_v3,
                     obj2_normal,
                     obj2_v,
                     criterio
                     ):
    i = 0
    distancia_final_v = []
    pontos_intersecao_final_v = []

    while i < len(obj2_v):

        distancia_relevante_v = []
        pontos_intersecao_v   = []
        distancia_inicial     = 1000

        for x in range(len(obj1_v1)):

            planeNormal = np.array( [obj1_normal[x][0],
                                     obj1_normal[x][1],
                                     obj1_normal[x][2]
                                     ] )
            planePoint  = np.array( [    obj1_v1[x][0],
                                         obj1_v1[x][1],
                                         obj1_v1[x][2]
                                         ] )          # Any point on the plane
            rayDirection = np.array([obj2_normal[i][0],
                                     obj2_normal[i][1],
                                     obj2_normal[i][2]
                                     ] )              # Define a ray
            rayPoint     = np.array([     obj2_v[i][0],
                                          obj2_v[i][1],
                                          obj2_v[i][2]
                                          ] )         # Any point along the ray

            Psi = Calculos.line_plane_collision( planeNormal,
                                                 planePoint,
                                                 rayDirection,
                                                 rayPoint
                                                 )

            a   = Calculos.area_trianglo_3d( obj1_v1[x][0],
                                             obj1_v1[x][1],
                                             obj1_v1[x][2],
                                             obj1_v2[x][0],
                                             obj1_v2[x][1],
                                             obj1_v2[x][2],
                                             obj1_v3[x][0],
                                             obj1_v3[x][1],
                                             obj1_v3[x][2]
                                             )
            b   = Calculos.area_trianglo_3d( obj1_v1[x][0],
                                             obj1_v1[x][1],
                                             obj1_v1[x][2],
                                             obj1_v2[x][0],
                                             obj1_v2[x][1],
                                             obj1_v2[x][2],
                                             Psi[0][0],
                                             Psi[0][1],
                                             Psi[0][2]
                                             )
            c   = Calculos.area_trianglo_3d( obj1_v1[x][0],
                                             obj1_v1[x][1],
                                             obj1_v1[x][2], 
                                             obj1_v3[x][0],
                                             obj1_v3[x][1],
                                             obj1_v3[x][2],
                                             Psi[0][0],
                                             Psi[0][1],
                                             Psi[0][2]
                                             )
            d   = Calculos.area_trianglo_3d( obj1_v2[x][0],
                                             obj1_v2[x][1],
                                             obj1_v2[x][2],
                                             obj1_v3[x][0],
                                             obj1_v3[x][1],
                                             obj1_v3[x][2],
                                             Psi[0][0],
                                             Psi[0][1],
                                             Psi[0][2]
                                             )

            if float("{:.5f}".format(a)) == float("{:.5f}".format(b + c + d)):

                P1 = Ponto(    Psi[0][0],    Psi[0][1],    Psi[0][2] )
                P2 = Ponto( obj2_v[i][0], obj2_v[i][1], obj2_v[i][2] )

                distancia = Calculos.distancia_pontos( P1, P2 ) * 10

                if distancia < distancia_inicial and distancia < criterio:
                    distancia_inicial     = distancia
                    distancia_relevante_v = []
                    distancia_relevante_v.append( distancia_inicial )
                    pontos_intersecao_v   = []
                    pontos_intersecao_v.append( Psi )

            x += 1

        distancia_final_v.append( distancia_relevante_v )
        pontos_intersecao_final_v.append( pontos_intersecao_v )

        i += 1

    return distancia_final_v, pontos_intersecao_final_v

在我的代码的此示例中,我想对obj2_v1, obj2_v2, obj2_v3进行相同的处理。

是否有可能使它们同时发生?

因为我将使用大量数据,这可能会为我节省一些处理时间。

[我正在实习的公司被告知使用多核编程的知识,鉴于我正在为自己的论文开发一个项目(我不是来自该领域,而是在从事一些...

python performance optimization parallel-processing multicore
3个回答
0
投票

multiprocessing(使用避免GIL的过程)是最简单的方法,但是您只能获得相对较小的性能改进,内核加速的数量是极限,请参见Amdahl's law。在开始/停止工作中还存在一些延迟,这意味着对于花费> 10ms的事情来说,这要好得多]

在数字重代码中(似乎是这样),您真的想在numpy内部移动尽可能多的内容,请查看vectorisationbroadcasting。这样可以使速度提高50倍以上(仅在单个内核上),同时更易于理解和推理。

如果您的算法难以使用numpy内在函数表示,那么您也可以考虑使用Cython。这使您可以编写自动编译为C的Python代码,因此速度更快。快50倍也可能是合理的提速,并且仍然在单核上运行


0
投票

有可能,但是使用python multiprocessing lib,因为线程化lib不提供并行执行。

UPDATE


0
投票

Q

“使它们同时发生可能吗?”
© www.soinside.com 2019 - 2024. All rights reserved.