2016-10-25 2 views
1

N-body simulation은 입자 상호 작용이 포함 된 물리적 시스템의 동적 인 시뮬레이션 또는 물리적 의미를 지닌 어떤 종류의 입자로 축소 된 문제에 사용됩니다. 입자는 은하계의 기체 분자 또는 별일 수 있습니다. 입자 개체가 단순히 NumPy와 배열 여기dask를 통한 효율적인 n 바디 시뮬레이션

class ParticleGenerator(): 
    def __init__(self, num_of_particles, max_position, seed=time.time()): 
     random.seed(seed) 
     self.index = -1 
     self.limit = num_of_particles 
     self.max_position = max_position 
    def __iter__(self): 
     return self 
    def __next__(self): 
     self.index += 1 
     if self.index < self.limit : 
      return np.array([self.max_position*random.random(), self.max_position*random.random(), self.max_position*random.random()]) 
     else : 
      raise StopIteration 
b = db.from_sequence(ParticleGenerator(1000, 1, seed=123456789)) 

하지만 수 : Dask.bag는 입자 개체를 반환하는 사용자 정의 반복자를, dask.bag.from_sequence() 제공, 예를 들어, 클러스터의 입자를 배포 할 수있는 간단한 방법을 제공합니다 뭐든지있어. 이제 모든 입자 사이의 상호 작용을 계산하기 위해 위치, 속도 및 유사한 양에 대한 정보를 공유해야합니다. dask.bag.map은 컬렉션의 모든 요소에 대해 함수를 매핑합니다.이 함수 내에서 요소와 다른 모든 입자 사이의 상호 작용을 계산하여 새 입자 상태를 얻습니다.

def update_position(e, others=None, mass=1, dt=1e-4): 
    f = np.zeros(3) 
    for o in others: 
     r = e - o 
     r_mag = np.sqrt(r.dot(r)) 
     if r_mag == 0 : 
      continue 
     f += (A/(r_mag**7) + B/(r_mag**13)) * r 
    return e + f * (dt**2/mass) 

AB 일부 임의 값 :

b = b.map(update_position, others=list(b)) 
b.compute() 

는 completitude, 이것은 update_position 함수이다. 루프 내에서 dask.bag.map()을 여러 번 호출하여 시뮬레이션을 실행할 수 있습니다.

  1. Dask.bag이 종류의 문제를 처리하기위한 좋은 컬렉션 (추상화)입니까? 어쩌면 Dask.distributed가 더 좋은 아이디어일까요?
  2. 시뮬레이션을 프로그래밍하면, 모든 통신을 처리하는 스케줄러 또는 위치, 속도 등에 대한 정보가 작업자 간 통신과 공유됩니까?
  3. 코드를 최적화하기위한 모든 의견은 있습니까? dask.bag.map()을 호출하는 동안 컬렉션을 목록으로 변환하는 데 과열 된 경우 특히 그렇습니다.

답변

1

일반적으로 N 바디 시뮬레이션에서는 효율적으로 실행하기 위해 정교한 알고리즘과 데이터 구조가 필요합니다. 많은 일반적인 솔루션은 복잡한 트리 데이터 구조의 사용을 포함합니다. kd-tree 또는 barnes-hut와 같은 용어를 검색 할 수 있습니다.

반면에 Dask.bag는 MapReduce 및 Spark와 같은 다른 대량 데이터 처리 시스템과 유사하게 상상할 수있는 가장 간단한/멍청한 병렬 프로그래밍 추상화 중 하나입니다. 이 시스템은 N 바디 시뮬레이션과 같은 복잡한 문제에 대해 우수한 성능을 발휘할만큼 유연하지 않습니다.

dask.array 또는 dask.delayed과 같은 것이 더 많은 유연성을 제공하지만 미세 조정 된 KD 트리와 동일하지는 않습니다.