사용자 도구

사이트 도구


kb:inteltbb

Intel Threading Building Blocks

http://threadingbuildingblocks.org/

Widely used C++ template library for task parallelism

컨테이너

목록

  • concurrent_unordered_map
    • insert, begin/end 동시 수행 가능
    • erase는 스레드 세이프하지 않다.
    • insert가 동시에 수행 가능하다보니, pair 객체가 임시로 생성되었다가 삭제될 수 있다.
  • concurrent_unordered_set
    • concurrent_unordered_map과 비슷
  • concurrent_hash_map
    • count, find, insert, erase 동시 수행 가능
    • begin/end는 스레드 세이프하지 않다. find, insert, erase 수행시 기존 iterator가 무효화될 수 있다.
  • concurrent_queue
    • push, pop은 동시 수행 가능. 동시 수행 가능하니, pop은 당연히 실패할 수 있다. 그래서 이름이 try_pop
    • size 함수는 정확하지 않을 수 있다. 그래서 이름이 unsafe_size
    • begin/end는 스레드 세이프하지 않고, 느리기까지 하다. 디버깅용 정도로만 사용하거나, 그냥 없다고 생각하자.
  • concurrent_bounded_queue
    • 최대 크기가 정해져 있는 큐
    • push 함수는 큐가 꽉 찬 경우, 블로킹된다.
    • try_pop 말고도 블로킹되는 pop 함수가 있다.
    • size 함수가 음수를 리턴할 수 있으며, 이는 대기 중인 pop 함수 호출의 갯수를 의미한다.
    • abort 함수를 통해 대기 중인 push, pop 함수를 취소시킬 수 있다. (예외 발생)
  • concurrent_priority_queue
    • 아이템이 우선 순위 기반으로 나온다는 것 말고는 concurrent_queue와 같다.
  • concurrent_vector
    • 컨테이너 끝에 아이템을 추가하는 것과 begin/end, at은 동시에 수행 가능
    • insert, erase, reserve, shrink_to_fit, swap, clear 류는 스레드 세이프하지 않다.
    • 컨테이너 크기 증가시키면서 동시에 access하는 경우, 아직 덜 완성된 객체에 대한 참조가 반환될 수 있다.

정리

  • concurrent_unordered_map vs concurrent_hash_map
    • concurrent_unordered_map: permits concurrent traversal and insertion, no visible locking, closely resembles the C++0x unordered_map.
    • concurrent_hash_map: permits concurrent erasure, built-in locking


메모리 할당자

목록

  • scalable_allocator
    • 걍 allocator?
  • cache_aligned_allocator
    • false sharing 문제를 해결하기 위한 할당자
    • 객체들이 서로 인접하는 걸 막기 위해, 작은 오브젝트를 할당하더라도 캐쉬 라인 크기(보통 128바이트)만큼의 메모리를 할당해버린다.

정리

  • 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 바이트 중에서 랜덤으로 할당 테스트했을 때 빠르다.
  • 8192 바이트를 테스트 셋에다 추가하니까, 느려진다. 대충 아무 것도 안 한 것보다 2배 정도 느리다.
  • 9K ~ 12K 사이에 있는 크기의 블록을 할당할 경우, 메모리 낭비가 심하다.

링크

kb/inteltbb.txt · 마지막으로 수정됨: 2015/11/06 09:34 저자 excel96