2008-09-20 7 views
24

인텔의 Threading Building Blocks (TBB) 오픈 소스 라이브러리는 정말 흥미 롭습니다. 피사체에 대한 내용이 O'Reilly Book인데도 많은 사람들이 사용하는 것에 대해 듣지 못합니다. Unix (Mac, Linux 등) 환경에서 일부 다중 레벨 병렬 응용 프로그램 (MPI + 스레드)에 사용하는 데 관심이 있습니다. 가치가있는 부분에 대해서는 고성능 컴퓨팅/수치 적 방법의 응용 프로그램에 관심이 있습니다.인텔의 스레딩 구성 요소를 사용한 경험이 있습니까?

TBB에 경험이있는 사람이 있습니까? 잘 작동합니까? 꽤 이식성이 있습니까 (GCC 및 다른 컴파일러 포함)? 필자가 작성한 프로그램에서 패러다임이 잘 작동합니까? 조사해야 할 다른 도서관이 있습니까?

+0

나는 이것들을 가지고 놀기를 바란다.하지만 그때까지는 TBB에 관한 경험에 대해서 정말로 관심이있다. – tgamblin

답변

12

16 코어 머신으로 이동할 때 사용할 bettor malloc이 필요하기 때문에이를 코드베이스에 도입했습니다. 8 세 이하는 중요한 문제가 아니 었습니다. 그것은 우리를 위해 잘 작동했습니다. 다음에 세분화 된 동시 컨테이너를 사용할 계획입니다. 이상적으로는 제품의 실제 고기를 사용할 수 있지만 코드를 작성하는 방법을 다시 생각해야합니다.TBB에서 아이디어를 정말 좋아하지만 코드 기반으로 개조하기가 쉽지 않습니다.

TBB를 다른 스레딩 라이브러리로 생각할 수 없습니다. 그들은 정말로 스레드의 꼭대기에 앉아서 스레드를 추상화하는 완전히 새로운 모델을 가지고 있습니다. 작업, 병렬 작업 및 파이프 라인에 대해 생각하는 법을 배웁니다. 새 프로젝트를 만들려면이 방법으로 모델을 만들려고합니다.

우리는 Visual Studio에서 작동하며 잘 작동합니다. 원래 linux/pthreads 용으로 작성되었으므로 거기에서도 잘 돌아갑니다.

2

TBB를 조사했지만 프로젝트에서 사용한 적이 없습니다. ZThread 이상의 장점이 없습니다. 짧고 다소 날짜가 오래된 개요는 here입니다.

여러 스레드 디스패치 옵션, 모든 일반적인 동기화 클래스 및 매우 편리한 예외 기반 스레드 "인터럽트"메커니즘이 상당히 완벽합니다. 쉽게 확장 할 수 있고, 잘 쓰고 문서화 할 수 있습니다. 20 개 이상의 프로젝트에서 사용했습니다.
또한 POSIX 스레드와 Windows를 지원하는 모든 * NIX와도 훌륭하게 작동합니다.

주목적

3

ZThread는 LGPL이므로 오픈 소스 프로젝트에서 작동하지 않는 경우 동적 연결로 라이브러리를 사용하도록 제한됩니다.

오픈 소스 버전의 TBB (새로운 상업용 버전 인 $ 299가 아직 차이점을 모르는 경우)는 GNU General Public License 버전 2이며 이른바 "런타임 예외 " (자유 소프트웨어를 만들 때만 사용됩니다.) LGPL에 접근하려고 시도했지만 상업적 사용이 가능하고 정적 연결을 사용하는 다른 런타임 예외를 보았습니다.은 이제입니다.

나는 라이브러리 라이센스를 검토 할 기회가 있었고, 또한 라이브러리 라이센스를 제공하려는 의도에 따라 선택을 고려해야하기 때문에이 서면으로 만 작성합니다. 이 업데이트를 지적


TXS, Jihn ... 나는 잠시 TBB를 사용하고, 아마도 미래에 더를 사용합니다

+0

TBB는 Apache 2.0을 오픈 소스 라이센스 (https://www.threadingbuildingblocks.org/faq/10)로 사용합니다. – Jeff

3

. 당신이 C++의 매크로/확장을 다루지 않아도되지만, 언어 내에 남아 있기 때문에 가장 중요하게 사용하는 것을 좋아했습니다. 또한 꽤 휴대용. 나는 창문과 리눅스 모두에 그것을 사용했다. 한 가지 : TBB를 사용하여 스레드로 작업하기는 어렵습니다. 실제로는 좋은 일이라고 생각하면됩니다. 인텔 TBB는 맨 손으로 자물쇠를 사용하는 것을 지원하지 않습니다 (지루함). 그러나 전반적으로, 이것은 나의 예비적인 경험이다.

나는 또한 openMP 3을 살펴 보는 것도 좋습니다.

5

수치 계산은하지 않지만 데이터 마이닝 (클러스터링 및 분류 생각)과 함께 작업 부하는 비슷할 것입니다 : 모든 데이터는 정적이며 프로그램의 시작 부분에 있습니다. 필자는 인텔의 TBB에 대해 간략히 조사한 결과 그들이 필요로하는 것이 지나치게 많다고 생각했습니다. 원시 pthread 기반 코드로 시작한 후 OPENMP로 전환하여 가독성과 성능 사이에서 올바른 조합을 얻었습니다.

1

오픈 소스 버전, 의 스레딩 빌딩 블록 (TBB) (거기는 $ 299, 아직 차이를 모르는 새로운 상용 버전 A) 을 함께 GNU 일반 공중 라이선스 버전 2 소위 "런타임 예외"(즉, 은 무료 소프트웨어를 만드는 데 사용에 따라 다릅니다.)이 를 연결하는 것은 아닙니다 나는 LGPL하지만 COMERCIAL 사용을 가능하게 접근 을 시도 다른 런타임 예외를 볼 정적했습니다 경우.

question에 따르면, 스레딩 빌딩 블록은 상업적 용도로 사본 좌 제한없이 사용할 수 있습니다.

2

하나의 프로젝트에서 TBB를 사용합니다. 스레드보다 사용하는 것이 더 쉬운 것처럼 보였습니다. 병렬로 실행할 수있는 작업이 있습니다. 작업은 병렬화 된 서브 루틴에 대한 호출 일뿐입니다. 로드 균형 조정은 자동으로 수행됩니다. 그래서 더 높은 수준의 병렬화 라이브러리로 받아들입니다. 나는 4 코어 인텔 프로세서에서 많은 작업없이 2.5 배의 속도를 달성했습니다. 예가 있으며, 포럼에 대한 질문에 답변하며 유지 관리되며 무료입니다.

2

휴대 성

TBB는 휴대용입니다. Intel 및 AMD (즉 x86) 프로세서, IBM PowerPC 및 POWER 프로세서, ARM 프로세서 및 기타 제품을 지원합니다. build directory을 보면 다양한 운영 체제 (Linux, Windows, Android, MacOS, iOS, FreeBSD, AIX 등) 및 컴파일러 (GCC, Intel 등)를 포함하는 빌드 시스템이 지원하는 모든 구성을 볼 수 있습니다. , Clang/LLVM, IBM XL 등). TBB를 PGI C++ 컴파일러로 사용하지 않았으며 Cray C++ 컴파일러 (2017 년 현재)와 호환되지 않는다는 것을 알고 있습니다.

몇 년 전, 저는 TBB를 IBM Blue Gene 시스템에 이식하기위한 노력의 일환이었습니다. 정적 연결은 어려웠지 만 이제는 big_iron.inc 빌드 시스템 도우미로 처리됩니다. 다른 문제는 상대적으로 고대 버전의 GCC (4.1 및 4.4)를 지원하고 PowerPC atomics가 작동하는지 확인하는 것이 었습니다. 현재 지원되지 않는 아키텍처로의 이식은 GCC 및 POSIX와 호환되거나 호환되는 플랫폼에서 비교적 간단합니다.지역 코드에

사용

내가 TBB를 사용하여 두 개 이상의 HPC 응용 프로그램 프레임 워크 알고 :

내가 어떻게 MOOSE 용도를 모른다 TBB이지만 MADNESS는 태스크 큐와 메모리 할당 자로 TBB를 사용합니다. 다른 스레딩 모델 나는 개인적으로 Parallel Research Kernels 내가 OpenMP를, OpenCL을, Kokkos 라자에 TBB를 비교 한있는 내 프로젝트, C++ 17 병렬 STL, 그리고 다른 모델에 TBB를 사용했다

성능. 자세한 내용은 C++ subdirectory을 참조하십시오.

다음 그림은 Intel Xeon Phi 7250 프로세서에서 앞서 언급 한 모델의 상대적 성능을 보여줍니다 (세부 사항은 중요하지 않으며 모든 모델은 동일한 설정을 사용함). 보시다시피, TBB는 적응 스케줄링의 오버 헤드가 더 중요한 작은 문제 크기를 제외하고는 꽤 잘합니다. TBB에는 이러한 결과에 영향을 줄 수있는 조정 손잡이가 있습니다.

PRK stencil

전체 공개 : 나는 연구/길 찾기 능력에 인텔 작동합니다.

1

TBB (Threading Building Blocks)가 다른 대안 (예 : C++ 11x 동시성 기능)과 대비되는 것은 분명한 사실입니다. TBB는 TBB가 사용 가능한 CPU 리소스에서 가능한 한 빨리 실행되도록 경량급 작업의 형태로 코드를 작성할 수 있도록 해주는 이식성 있고 확장 성이 뛰어난 라이브러리입니다 (컴파일러 확장은 아님). 다른 용도 (예 : 선매)를위한 스레딩을 지원하도록 고안되지 않았습니다.

필자는 이미지 주사선보다 parallel_for 루프 (2 ~ 4 줄 이상의 주사선을 '입자'크기로)에 대한 for 루프의 기존 이미지 처리 속도를 높이기 위해 TBB를 사용했습니다. 이것은 매우 성공적이었습니다. 루프 본문은 각 루프 본문이 순차적으로 처리된다고 가정하기보다는 임의의 인덱스를 처리하도록 작성되었습니다 (예 : 각 루프 반복간에 증가되는 포인터).

업데이트 할 공유 저장 장치가 없기 때문에 이는 매우 간단한 사례였습니다. 보다 강력한 기능 (예 : 파이프 라인)을 사용하려면 기존 코드의 재구성 및/또는 재 작성이 필요하므로 새로운 코드에 더 적합합니다.

이 TBB 기반 코드는 이식성이 유지되며 다른 스레드 전략을 사용하여 같은 프로세스의 다른 곳에서 다른 코드와 동시에 간섭하지 않는 것으로 보입니다. 나중에 높은 수준 또는 낮은 수준의 다중 처리 전략과 결합 될 수 있습니다 예를 들어, TBB parallel_for 코드는 TBB 멀티 프로세싱 파이프 라인의 필터에서 호출 될 수 있습니다.