문제

나는 개조 사용자 지정한 그래픽 엔진을 활용하는 멀티 코어 Cpu.더 많은 정확히,내가 찾는 것은 라이브러리를 병렬화를 반복합니다.

내가 보기에는 모두 OpenMP 및 인텔 스레드는 빌딩 블록은 매우 적합합니다.또한,양에 의해 지원되는 Visual Studio 의 C++컴파일러와는 다른 대부분의 인기있는 컴파일러입니다.모두 라이브러리는 꽤 바로 앞으로 사용합니다.

그래서,어떤 것을 선택해야 하나요?은 누구나 시도가 모두 라이브러리와 수 있는 나에게 약간의 장점 및 단점 중 하나를 사용하여 라이브러리?또한,당신은 무엇을 선택 작업에까요?

감사합니다,

Adrian

도움이 되었습니까?

해결책

나는 TBB를 광범위하게 사용하지 않았지만 내 인상은 그들이 경쟁하는 것보다 서로를 더 보완한다는 것입니다. TBB는 ThreadSafe 컨테이너와 일부 평행 알고리즘을 제공하는 반면 OpenMP는 기존 코드를 병렬화하는 방법에 가깝습니다.

개인적으로 나는 OpenMP가 병렬로 실행할 수있는 많은 섹션이있는 기존 코드로 삭제하기가 매우 쉽다는 것을 알았습니다. 그러나 TBB의 동시 컨테이너가 원하는 것이 될 수있는 일부 공유 데이터를 수정 해야하는 경우 특히 도움이되지 않습니다.

당신이 원하는 것은 반복이 독립적 인 루프를 병렬화하는 것입니다. 스레드간에 더 많은 상호 작용이 필요하다면 TBB가 그와 관련하여 조금 더 제공 할 수 있다고 생각합니다.

다른 팁

인텔의 소프트웨어 블로그에서 : 병렬 프로그래밍을위한 Windows* 스레드, OpenMP*, Intel® 스레딩 빌딩 블록 비교

그것은 또한 스타일의 문제입니다.

또한 팀의 기존 지식과 경험을 고려할 것입니다. 새로운 도서관을 배우는 것 (특히 스레딩/동시성과 관련하여)은 시간이 걸립니다. 현재로서는 OpenMP가 TBB보다 널리 알려져 있고 배치되어 있다고 생각합니다 (그러나 이것은 내 의견 일뿐입니다).

또 다른 요인 (그러나 가장 일반적인 플랫폼을 고려할 때 문제가되지 않을 것입니다. 그러나 라이센스는 문제가 될 수 있습니다.

  • TBB는 예를 들어 학술 연구에서 비롯된 멋진 연구를 통합합니다. 재귀 데이터 병렬 접근법.
  • 캐시 친화성에 대한 작업이 있습니다 예시.
  • 인텔 블로그의 강의는 정말 흥미로운 것 같습니다.

일반적으로 TBB를 사용하려면 높은 보상으로 코드베이스에 대한 훨씬 더 많은 시간이 걸리는 변경이 필요하지만 OpenMP는 빠르지 만 중간 정도의 보상을 제공합니다. 새로운 모듈을 처음부터 쳐다보고 장기적으로 생각한다면 TBB와 함께 가십시오. 작지만 즉각적인 이익을 원한다면 OpenMP와 함께 가십시오.

또한 TBB 및 OpenMP는 상호 배타적이지 않습니다.

나는 실제로 두 가지를 모두 사용했는데, 내 일반적인 인상은 알고리즘이 평행하게 만들기가 상당히 쉽다는 경우 (예 : 크기의 고리가 너무 많지 않고 너무 많은 데이터 상호 의존성이 아닙니다) OpenMP가 더 쉽고 작업하기에 매우 좋습니다. 실제로, 당신이 OpenMP를 사용할 수 있다면, 플랫폼이 그것을 지원한다는 것을 알고 있다면 더 좋은 방법 일 것입니다. OpenMP의 새로운 작업 구조를 사용하지 않았습니다.이 구조는 원래 루프 및 섹션 옵션보다 훨씬 일반적입니다.

TBB는 더 많은 데이터 구조를 선발하지만 더 많은 데이터 구조를 제공하지만 더 많은 미래가 필요합니다. 플러스로서 ~할 것 같다 인종 상태 버그를 더 잘 인식하는 데 더 잘하십시오. 내가 의미하는 바는 OpenMP에서 무언가를 공유하는 (또는 무엇이든)를 만들지 않아 레이스 조건을 가능하게하는 것이 매우 쉽다는 것입니다. 당신은 나쁜 결과를 얻을 때만 이것을 볼 수 있습니다. 나는 이것이 TBB에서 발생할 가능성이 조금 줄어 듭니다.

전반적으로 저의 개인적인 취향은 OpenMP, 특히 작업에 대한 표현력이 높아지는 경우였습니다.

Viva64 링크: 병렬 프로그래밍.

Yes,TBB 훨씬 더 C++는 동안 친화적 인 OpenMP 것이 더 적합한 프로그램-C 코드 스타일을 주는 디자인.새로운 작업 기능에 OpenMP 매우 흥미로운 보이는 동시에는 람다와 함수 개체에서는 C++0x 만들 수 있습 TBB 쉽게 사용할 수 있습니다.

Visual Studio 2008에서는 다음 줄을 추가하여 "for"loop을 병렬화 할 수 있습니다. 심지어 루프를 위해 여러 개의 중첩으로 작동합니다. 예는 다음과 같습니다.

#pragma omp parallel for private(i,j)
for (i=0; i<num_particles; i++)
{
  p[i].fitness = fitnessFunction(p[i].present);
  if (p[i].fitness > p[i].pbestFitness)
  { 
     p[i].pbestFitness = p[i].fitness;
     for (j=0; j<p[i].numVars; j++) p[i].pbest[j] = p[i].present[j];
  }
}  
gbest = pso_get_best(num_particles, p);

#Pragma Omp Parallel을 추가 한 후 Core 2 Duo의 두 코어는 최대 용량에 사용되었으므로 총 CPU 사용량은 50%에서 100%로 증가했습니다.

내가 아는 한, TBB (gplv2 avaiable에는 오펜스 소스 버전이 있음)는 C ++보다 더 많은 C ++를 연주합니다. 이 시간에는 C ++ 및 일반 OOP 병렬화 특정 정보를 찾기가 어렵습니다. Cuda 또는 OpenCL에서 동일하게 C와 같은 기능적 인 것들을 가장 많이주합니다. 병렬화에 대한 C ++ 지원이 필요한 경우 TBB로 이동하십시오!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top