2009-03-12 48 views
14

Làm cách nào để liên kết tĩnh intel's TBB libraries với đơn đăng ký của tôi? Tôi biết all the caveats chẳng hạn như phân phối tải không công bằng của trình lên lịch, nhưng tôi không cần bộ lập lịch biểu, chỉ là các vùng chứa, vì vậy nó ổn.Làm thế nào để liên kết tĩnh với TBB?

Dù sao tôi biết điều này có thể được thực hiện, mặc dù nó không có giấy tờ, tuy nhiên tôi dường như không thể tìm cách để làm điều đó ngay bây giờ (mặc dù tôi đã nhìn thấy nó trước một nơi nào đó).

Vì vậy, có ai biết hoặc có bất kỳ manh mối nào không?

cảm ơn

+0

bất kỳ nền tảng nào thực sự, cả hai cửa sổ, Linux, cộng với solaris. Tôi cần phải biết những gì thêm định nghĩa để thêm cho biên dịch thích hợp. –

Trả lời

1

Rất tiếc, có vẻ như không thể: From TBB site..
Một đề xuất trên diễn đàn Intel là biên dịch thủ công nếu bạn thực sự cần liên kết tĩnh: From Intel Forum.

+1

Có thể. Họ chỉ từ chối ghi lại nó bởi vì họ không muốn bất cứ ai làm điều đó. – Jeff

-1

Chỉ cần liên kết các tệp, tôi đã thực hiện và hoạt động. Đây là tập tin SConscript. Có hai thứ nhỏ, một biểu tượng có cùng tên trong tbb và tbbmalloc mà tôi đã ngăn chặn để được nhân xác định, và tôi ngăn cản việc sử dụng ITT_NOTIFY vì nó tạo ra một biểu tượng khác có cùng tên trong cả hai libs.

Import('g_CONFIGURATION') 
import os 
import SCutils 
import utils 

tbb_basedir = os.path.join(
    g_CONFIGURATION['basedir'], 
    '3rd-party/tbb40_233oss/') 

#print 'TBB base:', tbb_basedir 
#print 'CWD: ', os.getcwd() 

ccflags = [] 
cxxflags = [ 
    '-m64', 
    '-march=native', 
    '-I{0}'.format(tbb_basedir), 
    '-I{0}'.format(os.path.join(tbb_basedir, 'src')), 
    #'-I{0}'.format(os.path.join(tbb_basedir, 'src/tbb')), 
    '-I{0}'.format(os.path.join(tbb_basedir, 'src/rml/include')), 
    '-I{0}'.format(os.path.join(tbb_basedir, 'include')), 
] 
cppdefines = [ 
# 'DO_ITT_NOTIFY', 
    'USE_PTHREAD', 
    '__TBB_BUILD=1', 
] 
linkflags = [] 

if g_CONFIGURATION['build'] == 'debug': 
    ccflags.extend([ 
     '-O0', 
     '-g', 
     '-ggdb2', 
    ]) 
    cppdefines.extend([ 
     'TBB_USE_DEBUG', 
    ]) 

else: 
    ccflags.extend([ 
     '-O2', 
    ]) 


tbbenv = Environment(
    platform = 'posix', 
    CCFLAGS=ccflags, 
    CXXFLAGS=cxxflags, 
    CPPDEFINES=cppdefines, 
    LINKFLAGS=linkflags 
) 

############################################################################ 
# Build verbosity 
if not SCutils.has_option('verbose'): 
    SCutils.setup_quiet_build(tbbenv, True if SCutils.has_option('colorblind') else False) 
############################################################################ 



tbbmallocenv = tbbenv.Clone() 

tbbmallocenv.Append(CCFLAGS=[ 
    '-fno-rtti', 
    '-fno-exceptions', 
    '-fno-schedule-insns2', 
]) 

#tbbenv.Command('version_string.tmp', None, '') 

# Write version_string.tmp 
with open(os.path.join(os.getcwd(), 'version_string.tmp'), 'wb') as fd: 
    (out, err, ret) = utils.xcall([ 
     '/bin/bash', 
     os.path.join(g_CONFIGURATION['basedir'], '3rd-party/tbb40_233oss/build/version_info_linux.sh') 
    ]) 

    if ret: 
     raise SCons.Errors.StopError('version_info_linux.sh execution failed') 

    fd.write(out); 
    #print 'put version_string in', os.path.join(os.getcwd(), 'version_string.tmp') 
    #print out 
    fd.close() 

result = [] 

def setup_tbb(): 
    print 'CWD: ', os.getcwd() 
    tbb_sources = SCutils.find_files(os.path.join(tbb_basedir,'src/tbb'), r'^.*\.cpp$') 
    tbb_sources.extend([ 
     'src/tbbmalloc/frontend.cpp', 
     'src/tbbmalloc/backref.cpp', 
     'src/tbbmalloc/tbbmalloc.cpp', 
     'src/tbbmalloc/large_objects.cpp', 
     'src/tbbmalloc/backend.cpp', 
     'src/rml/client/rml_tbb.cpp', 
    ]) 


    print tbb_sources 
    result.append(tbbenv.StaticLibrary(target='libtbb', source=tbb_sources)) 


setup_tbb() 

Return('result') 
4

này được mạnh mẽ không được khuyến khích:

Có một phiên bản của TBB cung cấp các thư viện liên kết tĩnh?

TBB không được cung cấp dưới dạng thư viện được liên kết tĩnh, vì các lý do sau *:

Hầu hết các thư viện đều hoạt động cục bộ. Ví dụ, một Intel (R) MKL FFT biến đổi một mảng. Nó không liên quan bao nhiêu bản sao của FFT có. Nhiều bản sao và phiên bản có thể cùng tồn tại mà không gặp khó khăn. Nhưng một số thư viện kiểm soát tài nguyên trên toàn chương trình, chẳng hạn như bộ nhớ và bộ vi xử lý. Ví dụ, các bộ thu gom rác kiểm soát việc cấp phát bộ nhớ trên một chương trình. Tương tự, TBB điều khiển lập kế hoạch nhiệm vụ trên một chương trình. Để làm công việc của họ một cách hiệu quả, mỗi người trong số này phải là một singleton; có nghĩa là, có một trường hợp duy nhất có thể điều phối các hoạt động trên toàn bộ chương trình. Việc cho phép k các cá thể của trình lập lịch biểu TBB trong một chương trình đơn lẻ sẽ khiến cho số lần tạo phần mềm là nhiều chủ đề phần cứng. Chương trình sẽ hoạt động không hiệu quả, bởi vì máy sẽ được oversubscribed bởi một yếu tố của k, gây ra nhiều bối cảnh chuyển đổi, bộ nhớ cache ganh đua, và bộ nhớ tiêu thụ. Hơn nữa, sự hỗ trợ hiệu quả của TBB đối với tính song song lồng nhau sẽ được phủ nhận khi song song lồng nhau phát sinh từ các lời gọi lồng nhau của các bộ lập lịch riêng biệt.

Giải pháp thực tế nhất để tạo một singleton toàn chương trình là thư viện được chia sẻ động chứa singleton. Tất nhiên nếu lịch trình có thể hợp tác, chúng tôi sẽ không cần một singleton. Nhưng sự hợp tác đó đòi hỏi một tác nhân tập trung để giao tiếp thông qua; đó là, một singleton!

Quyết định bỏ qua phiên bản TBB có thể liên kết tĩnh của chúng tôi bị ảnh hưởng mạnh mẽ bởi trải nghiệm OpenMP của chúng tôi. Giống như TBB, OpenMP cũng cố gắng lên lịch trên một chương trình. Một phiên bản tĩnh của thời gian chạy OpenMP đã từng được cung cấp, và nó đã là một nguồn liên tục của các vấn đề nảy sinh từ các trình lên lịch trùng lặp. Chúng tôi nghĩ tốt nhất là không lặp lại lịch sử đó. Là một bằng chứng gián tiếp về tính hợp lệ của những cân nhắc này, chúng ta có thể chỉ ra rằng Microsoft Visual C++ chỉ cung cấp hỗ trợ OpenMP thông qua các thư viện động.

Nguồn: http://www.threadingbuildingblocks.org/faq/11#sthash.t3BrizFQ.dpuf

+1

Điều này có nghĩa là bằng cách sử dụng thư viện chia sẻ TBB có dữ liệu được chia sẻ trên nhiều quy trình trên cùng một máy không? Đó là, một "chương trình" (nơi mà nó nói "singleton toàn chương trình") có nghĩa là nhiều quá trình? Hay nó có nghĩa là nếu bạn liên kết tĩnh TBB, bạn sẽ nhận được nhiều đơn trong một quá trình đơn lẻ? Tôi không hiểu nó sẽ hoạt động như thế nào trong trường hợp thứ hai. – sourcedelica

+2

Intel cung cấp build/big_iron.inc dành riêng cho mục đích xây dựng một thư viện tĩnh. Vì vậy, tôi không nghĩ rằng câu trả lời này vẽ bức tranh đầy đủ. Đề xuất câu trả lời của sourcedelica dưới đây là câu trả lời đúng. – mattismyname

2

Sử dụng phiên bản mã nguồn mở:

Sau khi chạy "làm cho TBB", đi đến thư mục build/linux_xxxxxxxx_release.

Sau đó chạy:

ar -r libtbb.a concurrent_hash_map.o concurrent_queue.o concurrent_vector.o 
dynamic_link.o itt_notify.o cache_aligned_allocator.o pipeline.o queuing_mutex.o 
queuing_rw_mutex.o reader_writer_lock.o spin_rw_mutex.o spin_mutex.o critical_section.o 
task.o tbb_misc.o tbb_misc_ex.o mutex.o recursive_mutex.o condition_variable.o 
tbb_thread.o concurrent_monitor.o semaphore.o private_server.o rml_tbb.o 
task_group_context.o governor.o market.o arena.o scheduler.o observer_proxy.o 
tbb_statistics.o tbb_main.o concurrent_vector_v2.o concurrent_queue_v2.o 
spin_rw_mutex_v2.o task_v2.o 

Và bạn sẽ nhận được libtbb.a như đầu ra.

Lưu ý rằng chương trình của bạn nên xây dựng cả với "-ldl" và libtbb.a

5

EDIT - Thay đổi để sử dụng extra_inc. Cảm ơn Jeff!

Xây dựng với các thông số sau:

make extra_inc=big_iron.inc 

Các thư viện tĩnh sẽ được xây dựng. Xem các thông báo trong build/big_iron.inc.

3

xây dựng thư viện tĩnh từ nguồn

Sau khi có được mã nguồn từ https://www.threadingbuildingblocks.org/, xây dựng TBB như thế này:

make extra_inc=big_iron.inc

Nếu bạn cần tùy chọn bổ sung, sau đó thay vì xây dựng như thế này:

make extra_inc=big_iron.inc <extra options>

Chạy nhiều TBB progra ms per node

Nếu bạn chạy một ứng dụng đa xử lý, ví dụ: bằng cách sử dụng MPI, bạn có thể cần phải khởi tạo một cách rõ ràng bộ lập lịch TBB với số luồng thích hợp để tránh quá trình đăng ký quá liều.

Ví dụ về điều này trong một ứng dụng lớn có thể được tìm thấy trong https://github.com/m-a-d-n-e-s-s/madness/blob/master/src/madness/world/thread.cc.

Nhận xét về tài liệu

tính năng này đã có sẵn trong nhiều năm (ít nhất là từ năm 2013), mặc dù nó không được ghi chép lại vì những lý do được mô tả trong câu trả lời khác.

lịch sử lưu ý

Tính năng này được phát triển bởi IBM Blue Gene và Cray siêu máy tính hoặc không hỗ trợ các thư viện chia sẻ hoặc không hoạt động tốt khi sử dụng chúng, do thiếu một hệ thống tập tin được gắn tại địa phương.

1

Mặc dù không chính thức xác nhận bởi nhóm TBB, có thể xây dựng phiên bản TBB được liên kết tĩnh của riêng bạn với make extra_inc=big_iron.inc.

tôi đã không thử nghiệm nó trên Windows hay MacOS, nhưng trên Linux, nó làm việc (source):

wget https://github.com/01org/tbb/archive/2017_U6.tar.gz 
tar xzfv 2017_U6.tar.gz 
cd tbb-2017_U6 
make extra_inc=big_iron.inc 

Các tập tin được tạo ra trong tbb-2017_U6/build/linux*release.

Khi bạn liên kết ứng dụng của bạn lên phiên bản TBB tĩnh:

  • Gọi g ++ với -static switch
  • liên kết chống lại TBB (-ltbb) và pthread (-lpthread)

Trong thử nghiệm của tôi , Tôi cũng cần tham chiếu rõ ràng tất cả các tệp .o từ phiên bản TBB xây dựng theo cách thủ công. Tùy thuộc vào dự án của bạn, bạn cũng có thể cần phải vượt qua -pthread đến gcc.

Tôi đã tạo ra một ví dụ đồ chơi để ghi lại tất cả các bước trong kho Github này:

Nó cũng chứa mã kiểm tra để chắc chắn rằng nhị phân được tạo ra là di động trên Linux khác phân phối.

Các vấn đề liên quan