2017-03-24 16 views
2

glibc-2.25のさまざまなバージョン(sse4、ssse3、avx2、avx512)のいくつかのメモリ関数(memcpy、memset、memmove)が、 Linux(glibc 2.12)。
私の最初の試みは、glibc-2.25のタールボールをダウンロードし、こちらの手順に従ってください。https://sourceware.org/glibc/wiki/Testing/Buildsです。私は手動でカーネルのバージョンチェックをコメントアウトし、すべてうまくいった。そして、プログラムはglibcのウィキと「LDDテスト」の「glibcのビルドツリーに対してコンパイル」セクションに記載された手順で、新しく建てられたglibcにリンクされたテストでは、それは確かに予想ライブラリに依存することを示しています。ポートglibc 2.25とテストメモリ関数

私が使用
# $GLIBC is /data8/home/wentingli/temp/glibc/build 
    libm.so.6 => /data8/home/wentingli/temp/glibc/build/math/libm.so.6 (0x00007fe42f364000) 
    libc.so.6 => /data8/home/wentingli/temp/glibc/build/libc.so.6 (0x00007fe42efc4000) 
    /data8/home/wentingli/temp/glibc/build/elf/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fe42f787000) 
    libdl.so.2 => /data8/home/wentingli/temp/glibc/build/dlfcn/libdl.so.2 (0x00007fe42edc0000) 
    libpthread.so.0 => /data8/home/wentingli/temp/glibc/build/nptl/libpthread.so.0 (0x00007fe42eba2000) 

実際に呼び出されたmemset/memcpyを確認するためにgdbを実行しますが、関数のより高度なバージョン(avx2、avx512)がin useであると予想されている間は常に__memset_sse2_unaligned_ermsが使用されていることを示しています。 私の質問は以下のとおりです。

  1. はglibcの-2.25は、自動的にCPU/OS /メモリアドレスに応じてメモリ機能の最適なバージョンを選択しましたか?そうでない場合は、glibcの構築中に設定が失われているか、セットアップに何か問題がありますか?
  2. 新しいglibcからメモリ関数を移植するための他の選択肢はありますか?

ご意見やご提案をいただければ幸いです。

答えて

0

x86では、glibcはシステムのCPUに最も適したインプリメンテーションを自動的に選択します。通常、インテルの指針に基づいています。 (多くのベクトル命令のパフォーマンスのトレードオフが非常に複雑であるため、これがあなたのシナリオにとって最良の選択であるかどうかは明らかではないかもしれません)。ツールチェーンでIFUNCを明示的に無効にした場合のみ、これは起こりませんが、__memset_sse2_unaligned_erms isn 'これはここでは当てはまりません。 ERMS機能はかなり最近のものなので、これは完全に不合理ではありません。

新しいglibcを構築することは、おそらく、これらの文字列関数をテストする正しい方法です。理論的には、LD_PRELOADを使ってglibcが提供する関数をオーバーライドすることもできますが、glibcビルドシステムの外に文字列関数を構築するのは面倒です。

パッチを適用しないglibcに対してプログラムを実行したい場合は、glibcビルドディレクトリのtestrun.shスクリプト(またはそれに類似した方法)を使用する必要があります。

+0

[glibc wiki](https://sourceware.org/glibc/wiki/Testing/Builds)は、新しいglibcをテストするためのいくつかのアプローチを提供していますが、これは生産環境では少し複雑で不適切です。通常は、fundermantalコアシステムコンポーネントであるglibcを置き換えるべきではないという提案に従います。これらの文字列関数を別々に構築するのはちょっと面倒です(特にキャッシュ/ CPUの検出) – WindLeeWT

+0

あなたの返事には大変感謝しています。 LD_PRELOADで新しいglibcを使うと、プログラムが不安定になり、予期せずクラッシュする可能性があります。 – WindLeeWT

+0

ビルドディレクトリの 'testrun.sh'スクリプトと同様に、アンインストールされたglibcに対してプログラムを実行するには、明示的な動的リンカ呼び出しを使用する必要があります。 –

関連する問題