[我正在实习的公司被告知使用多核编程,鉴于我正在为自己的论文开发一个项目(我不是来自该地区,而是在从事一些涉及编码)。
我想知道是否可行:我有一个已定义的函数,将对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
进行相同的处理。
是否有可能使它们同时发生?
因为我将使用大量数据,这可能会为我节省一些处理时间。
[我正在实习的公司被告知使用多核编程的知识,鉴于我正在为自己的论文开发一个项目(我不是来自该领域,而是在从事一些...
multiprocessing
(使用避免GIL的过程)是最简单的方法,但是您只能获得相对较小的性能改进,内核加速的数量是极限,请参见Amdahl's law。在开始/停止工作中还存在一些延迟,这意味着对于花费> 10ms的事情来说,这要好得多]
在数字重代码中(似乎是这样),您真的想在numpy内部移动尽可能多的内容,请查看vectorisation和broadcasting。这样可以使速度提高50倍以上(仅在单个内核上),同时更易于理解和推理。
如果您的算法难以使用numpy内在函数表示,那么您也可以考虑使用Cython。这使您可以编写自动编译为C的Python代码,因此速度更快。快50倍也可能是合理的提速,并且仍然在单核上运行
有可能,但是使用python multiprocessing lib,因为线程化lib不提供并行执行。
UPDATE
Q
:“使它们同时发生可能吗?”