2012-06-08 5 views
3

Linux에서 멀티 스레드 응용 프로그램을 만들고 있습니다. 여기에 시나리오가 있습니다 :Cilk 또는 Cilk ++ 또는 OpenMP

x 인스턴스의 인스턴스가 BloomFilter이고 y GB의 데이터 (사용 가능한 메모리보다 큼)가 있다고 가정합니다. 블룸 필터 인스턴스 각각에서이 yGB의 데이터에 대한 멤버십을 테스트해야합니다. 모든 프로세스 나 스레드에서 데이터를 공유 할 수 있도록 데이터를 읽는 중이므로 병렬 프로그래밍이 작업 속도를 높이는 데 도움이 될 것입니다.

이제 Cilk, Cilk ++ 또는 OpenMP (어느 쪽이 더 낫습니까?)를 사용하는 방법에 대해 혼란스러워합니다. 또한 멀티 스레딩 또는 멀티 프로세싱을 위해 어느 것을 사용해야하는지 혼란 스럽습니다.

답변

3

Cilk Plus는 Intel의 Cilk 구현입니다. 둘 다 다중 스레드 환경입니다. 즉, 실행 중에 여러 스레드가 생성됩니다.

병렬 프로그래밍을 처음 접했을 경우 이미 개발 된 순차 코드를보다 쉽게 ​​병렬화 할 수 있으므로 OpenMP가 더 좋을 것입니다. 이미 코드의 순차적 인 버전이 있습니까?

OpenMP는 컴파일러가 병렬로 실행해야하는 코드 부분을 지시하기 위해 pragma를 사용합니다.

#pragma omp parallel for firstprivate(array_of_bloom_filters) 
    for i in DATA: 
     check(i,array_of_bloom_filters); 

다른 꽃 필터의 인스턴스 데이터가 스레드간에 공유되는 동안 경합을 피하기 위해 모든 스레드에서 복제 : 나는 당신의 문제를 이해한다면 제대로 당신은 아마 이런 식으로 뭔가를해야합니다.

업데이트 : 용지 실제로 매우 불균형 애플리케이션, 즉, (다른 스레드에 할당 된) 다른 TAKS 매우 다른 작업 부하에서 발생할 수를 고려한다. 앞서 언급 한 논문을 인용하면 "스케줄링에 어려움을주는 고도로 불균형 한 작업 그래프, 로드 밸런싱, 종료 감지 및 작업 조율 전략"이 있습니다. 스레드간에 계산의 균형을 유지하려면 작업 크기를 줄여서 동기화에 소요되는 시간을 늘려야합니다. 즉, 항상 좋은 부하 분산이 비용으로 발생합니다. 귀하의 문제에 대한 설명은 자세하게 설명되어 있지 않지만 귀하가 가진 문제는 상당히 균형이 잡혀있는 것으로 보입니다. 이것이 사실이 아니라면, Cilk을 위해 가십시오, 그것의 work stealing approach는 아마도 아마도 언밸런스 워크로드를위한 최상의 솔루션입니다.

+0

내가 찾고있는 것이 효율성이므로 어느 쪽이 더 낫다. 나는이 논문 (www.cs.unc.edu/~prins/RecentPubs/ijpp10.pdf)을 참조했으며 OpenMP가 느리다는 견해를 갖고있다. 그래서 나는 플러스를 선택했다. 이에 대한 의견이 있으십니까? –

+0

나는 내 대답을 편집했다. – igon

+0

예, 저는 또한 제가 작업하고있는 문제가 공정하게 균형 잡혀 있다고 생각합니다. 내가 틀렸다고 정정하십시오 : 공정하게 균형 잡힌 프로세스의 경우 OpenMP와 cilk가 비슷한 결과를 나타냅니다. 성능면에서 우리는 주어진 패키지 중 하나를 선택할 수 있습니다. –

1

인텔이 게시 할 당시 Cilk (tm) Plus를 높이는 데 많은 노력을 기울였습니다. 최근에는 OpenMP 4.0을 향한 노력이 일부 변경되었습니다. OpenMP와 Cilk (tm) Plus를 비교하는 것은 일반적으로 어렵습니다.
스레드간에 작업을 균등하게 분산시킬 수 없다면 OpenMP 버전에서 일정 (런타임)을 설정 한 다음 런타임에 OMP_SCHEDULE = guided, OMP_SCHEDULE = dynamic, 2 또는와 같은 다양한 환경 변수 값을 시도하십시오. OMP_SCHEDULE = 자동. 그것들은 Cilk (tm) Plus 도둑질이 작동하는 방식에 가장 가까운 OpenMP 유추 법입니다. 인텔 MKL 라이브러리의 일부 희소 행렬 함수는 실제로 작업을 먼저 스캔하고 작업 균형을 조정하기 위해 각 스레드에 할당 할 양을 결정합니다. 이 방법을 유용하게 사용하려면 직렬 검색 및 할당에 소요되는 시간이 병렬 작업에 소요되는 시간보다 낮아야합니다. 작업 도용 또는 동적 스케줄링은 캐시 위치를 가진 스레드를 고정하여 캐시 위치를 향상시키는 데있어서 OpenMP의 잠재적 이점을 많이 잃을 수 있습니다. OMP_PROC_BIND = close. NUMA 아키텍처에서 캐시 지역이 불량 해지면 원격 메모리 액세스에 많은 시간이 소요될 수 있습니다. OpenMP 및 Cilk (tm) Plus에는 직렬 및 병렬 실행 간 전환 기능이 있습니다.

+1

이 답변은 나에게 약간의 구약 (그리고 형편없는 형식) 인 것처럼 보입니다. 당신은 읽기 (그리고 upvoted)의 더 나은 가능성을 가진 답을 쓰는 방법에 대한 힌트를 얻기 위해 [여기] (http://stackoverflow.com/help/how-to-answer)를보고 싶을 수도 있습니다. – Massimiliano