インテルの TBB ライブラリをアプリケーションに静的にリンクするにはどうすればよいですか? スケジューラーの不公平な負荷分散などの注意点はすべて知っていますが、スケジューラーは必要なく、コンテナーだけが必要なので、問題ありません。
とにかく、文書化されていませんが、これを行うことができることは知っていますが、今はそれを行う方法を見つけることができないようです(どこかで見たことはありますが)。
それで、誰かが知っているか、手がかりを持っていますか?
ありがとう
インテルの TBB ライブラリをアプリケーションに静的にリンクするにはどうすればよいですか? スケジューラーの不公平な負荷分散などの注意点はすべて知っていますが、スケジューラーは必要なく、コンテナーだけが必要なので、問題ありません。
とにかく、文書化されていませんが、これを行うことができることは知っていますが、今はそれを行う方法を見つけることができないようです(どこかで見たことはありますが)。
それで、誰かが知っているか、手がかりを持っていますか?
ありがとう
これは強くお勧めしません:
静的にリンクされたライブラリを提供する TBB のバージョンはありますか?
TBB は、次の理由により、静的にリンクされたライブラリとして提供されていません*:
ほとんどの図書館はローカルで運営されています。たとえば、インテル(R) MKL FFT は配列を変換します。FFT のコピーの数は関係ありません。複数のコピーとバージョンが問題なく共存できます。ただし、一部のライブラリは、メモリやプロセッサなど、プログラム全体のリソースを制御します。たとえば、ガベージ コレクターは、プログラム全体のメモリ割り当てを制御します。同様に、TBB はプログラム全体のタスクのスケジューリングを制御します。その仕事を効果的に行うには、これらのそれぞれがシングルトンでなければなりません。つまり、プログラム全体でアクティビティを調整できる唯一のインスタンスがあります。1 つのプログラムで TBB スケジューラの k インスタンスを許可すると、ハードウェア スレッドの k 倍のソフトウェア スレッドが存在することになります。マシンが k 倍オーバーサブスクライブされ、より多くのコンテキスト切り替えが発生するため、プログラムは非効率的に動作します。キャッシュ競合、およびメモリ消費。さらに、ネストされた並列処理が個別のスケジューラのネストされた呼び出しから発生した場合、TBB のネストされた並列処理に対する効率的なサポートは無効になります。
プログラム全体のシングルトンを作成するための最も実用的なソリューションは、シングルトンを含む動的共有ライブラリです。もちろん、スケジューラが連携できれば、シングルトンは必要ありません。しかし、その協力には、通信するための集中化されたエージェントが必要です。つまり、シングルトンです。
TBB の静的にリンク可能なバージョンを省略するという私たちの決定は、OpenMP の経験に強く影響されました。TBB と同様に、OpenMP もプログラム全体でスケジュールを設定しようとします。OpenMP* ランタイムの静的バージョンが提供されたこともありましたが、重複したスケジューラーから生じる問題の原因となっていました。私たちは、その歴史を繰り返さないことが最善だと考えています。これらの考慮事項の妥当性を間接的に証明するものとして、Microsoft Visual C++ が動的ライブラリを介してのみ OpenMP サポートを提供するという事実を指摘できます。
ソース: http://www.threadingbuildingblocks.org/faq/11#sthash.t3BrizFQ.dpuf
編集- を使用するように変更されましたextra_inc
。ありがとうジェフ!
次のパラメーターを使用してビルドします。
make extra_inc=big_iron.inc
静的ライブラリがビルドされます。の注意事項を参照してくださいbuild/big_iron.inc
。
https://www.threadingbuildingblocks.org/からソース コードを取得したら、次のように TBB をビルドします。
make extra_inc=big_iron.inc
追加のオプションが必要な場合は、代わりに次のようにビルドします。
make extra_inc=big_iron.inc <extra options>
MPI などを使用してマルチプロセッシング アプリケーションを実行する場合、オーバーサブスクリプションを回避するために、適切な数のスレッドで TBB スケジューラを明示的に初期化する必要がある場合があります。
大規模なアプリケーションでのこの例は、https://github.com/madness/madness/blob/master/src/madness/world/thread.ccにあります。
この機能は長年 (少なくとも 2013 年以降) 利用可能でしたが、他の回答で説明されている理由により文書化されていません。
この機能はもともと、IBM Blue Gene および Cray スーパーコンピューターが共有ライブラリーをサポートしていなかったか、ローカルにマウントされたファイルシステムがないためにそれらを使用したときにうまく機能しなかったために開発されました。
残念ながら、それは可能ではないようです: TBB サイトより。.
Intel フォーラムでの 1 つの提案は、静的リンケージが本当に必要な場合は手動でコンパイルすることでした: From Intel Forum .
ファイルをリンクするだけで、私はそれを実行して動作します。これがSConscriptファイルです。2つのマイナーなことがあります。tbbとtbbmallocで同じ名前のシンボルで、複数定義されないようにする必要がありました。また、両方のライブラリで同じ名前の別のシンボルが作成されるため、ITT_NOTIFYの使用を防ぎました。
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')