cython
을 사용하여 함수를 올바르게 병렬 처리하는 데 어려움을 겪고 있습니다. 기본적으로 문제는 일부 데이터를 보관하는 것입니다. 실제 코드는 조금 긴했지만 결국은 이런 일을 수행합니다cython에서 for 루프를 Parallelising : prange 너머
def bin_var(double[:] dist,
double[:] values,
double[:] bin_def,
double[:] varg, long[:] count):
dbin = (bin_def[1] - bin_def[0])/bin_def[2]
for n1 in range(values.size):
if (dist[n1] < bin_def[0]) or (dist[n1] >= bin_def[1]):
continue
else:
ni = int((dist - bin_def[0])/dbin)
count[ni] += 1
varg[ni] += calc_something(values[ni])
# compute the mean
for n1 in range(int(bin_def[2])):
varg[ni] /= count[ni]
이 코드는 간단한 parallelisation (values
및 dist
이 매우 큰)라는 것으로를 하나 첫 번째 for
루프를 분할 할 필요가 별도의 프로세스를 통해 각각은 count
및 varg
어레이의 자체 버전에서 작업합니다. 이것이 완료되면 두 번째 for 루프 (훨씬 짧음) 전에 count
및 varg
의 다른 버전을 합하여 모든 것을 결합해야합니다.
즉, 효율적으로 이것을 구현하는 방법을 이틀간에 알고 싶습니다. cython
에서이 언어의 최신 버전을 사용할 수 없다고 생각하기 시작했습니다. 첫 번째 루프에 대해 prange
에서 cython.parallel
까지만 사용하면 다른 스레드에서 ni
, count
및 varg
의 동시 액세스가 있기 때문에 정확한 결과를 제공하지 않습니다.
cython
병렬 지원이 정말로 제한적입니까? 나는 그런 좋은 속도 향상은 단일 스레드 얻고 있었다, 난 그냥
고마워, 나는 길을 길로 시도했지만 내 'calc_something'은 너무 느려서 언급하지 않았다. 다른 옵션은 매우 유망한 것 같습니다. – user6760680
솔루션 2는 나를위한 길 이었지만, 큰 문제 (실제로 관심이있는 문제)에 대해서만 노력할 가치가 있습니다. 그러나'prange'는 루프 이후에'return'을 강요하는 것처럼 이상한 행동을합니다. 나는 솔루션 3을 시도하지 않았다. – user6760680
나는 해결책 3을 얻지 못해서 네가 잘 피하는 것이 좋다고 생각한다. :) – DavidW