16

実際に私は2つの質問があります:

  1. SSE2の互換性はCPUの問題ですか、それともコンパイラの問題ですか?
  2. CPUまたはコンパイラがSSE2をサポートしているかどうかを確認するにはどうすればよいですか?

私はGCCバージョンを使用しています:

gcc (GCC) 4.5.1

コードをコンパイルしようとすると、次のエラーが発生します。

$ gcc -O3 -msse2 -fno-strict-aliasing -DHAVE_SSE2=1 -DMEXP=19937 -o test-sse2-M19937 test.c
cc1: error: unrecognized command line option "-msse2"

そしてcpuinfoこれを示した:

processor  : 0
vendor     : GenuineIntel
arch       : IA-64
family     : 32
model      : 1
model name : Dual-Core Intel(R) Itanium(R) Processor 9140M
revision   : 1
archrev    : 0
features   : branchlong, 16-byte atomic ops
cpu number : 0
cpu regs   : 4
cpu MHz    : 1669.000503
itc MHz    : 416.875000
BogoMIPS   : 3325.95
siblings   : 2
physical id: 0
core id    : 0
thread id  : 0
4

5 に答える 5

18

CPUはSSE2命令を実行できる必要があり、コンパイラーはそれらを生成できる必要があります。

CPUがSSE2をサポートしているかどうかを確認するには:

# cat /proc/cpuinfo

サポートされている場合は、「フラグ」の下のどこかになります。

更新:CPUはそれをサポートしていません。

コンパイラーの場合:

# gcc -dumpmachine
# gcc --version

このCPUのみがx86命令セットの一部であるsse2をサポートしているため、コンパイラのターゲットは一種のx86*である必要があります。

SSE2をサポートするには、gccバージョンが3.1以上である必要があります(これは約10年前のものであるため、ほとんどの場合)。

更新:したがって、コンパイラはこのターゲットでサポートしていません。x86のクロスコンパイラとして使用している場合はサポートします。

于 2010-11-17T10:02:02.147 に答える
7
  1. それは両方です。コンパイラ/アセンブラはSSE2命令を発行/処理できる必要があり、CPUはそれらをサポートする必要があります。バイナリに条件が添付されていないSSE2命令があり、Pentium IIで実行しようとすると、運が悪くなります。

  2. 最良の方法は、GCCマニュアルを確認することです。たとえば、私のGCCマンページは、バイナリでSSE2命令を明示的に有効にできる-msse2オプションを参照しています。比較的最近のGCCまたはICCはそれをサポートする必要があります。CPUについては、/ proc/cpuinfoのフラグ行を確認してください。

ただし、cpuidなどを使用してコードをチェックインすることをお勧めします。これにより、SSE2セクションがサポートされていないCPUで無効になり、コードがより一般的な命令セットにフォールバックできるようになります。

編集:

コンパイラは、x86システムで実行されているネイティブコンパイラか、x86用のクロスコンパイラである必要があることに注意してください。そうしないと、SSE2を含むx86プロセッサ用のバイナリをコンパイルするために必要なオプションがありません。

あなたの場合、CPUはx86をまったくサポートしていません。Linuxディストリビューションによっては、x86-software-on-IA64用のIntel IA32ELエミュレーションレイヤーを備えたパッケージが存在する場合があります。これにより、x86ソフトウェアを実行できる場合があります。

したがって、次のオプションがあります。

  • IA64で実行され、x86用のバイナリを生成するクロスコンパイラを使用します。ただし、クロスコンパイラツールチェーンは、コンパイラ(binutils、ライブラリなど)だけでなく、それ以上のものが必要になるため、セットアップが簡単ではありません。

  • Intel IA32ELを使用して、ネイティブx86コンパイラを実行します。ネイティブのx86ツールチェーンをインストールする方法がわかりません。プロジェクトでディストリビューションに必要なすべてのライブラリが直接サポートしているわけではありません。おそらく、x86ディストリビューションの本格的なchrootインストールですか?

次に、このシステムでビルドをテストする場合、Linux用のIntelのIA32ELをインストールする必要があります。

EDIT2:

BochsやQEMUなどのエミュレーターで完全なx86Linuxディストリビューションを実行することもできると思います(もちろん仮想化はありません)。しかし、結果として生じる速度に目がくらむことは絶対にありません。

于 2010-11-17T10:08:58.760 に答える
7

まだ言及されていない別のトリックはdoです:

gcc -march=native -dM -E - </dev/null | grep SSE2

そして取得:

#define __SSE2_MATH__ 1
#define __SSE2__ 1

-march = nativeを使用すると、コンパイラとCPUの両方をチェックします。-march = bonnellのように、特定のCPUに別の-marchを指定すると、そのCPUを確認できます。

gccの正しいバージョンについては、gccのドキュメントを参照してください。

https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Submodel-Options.html

于 2017-08-14T05:28:42.527 に答える
3

asmを使用してsse2の存在を確認します

enter code here
static
bool HaveSSE2()
{
    return false;
    __asm mov EAX,1              ;
    __asm cpuid                  ;
    __asm test EDX, 4000000h     ;test whether bit 26 is set
    __asm jnz yes                ;yes
    return false;
yes:
    return true;
}
于 2011-01-04T07:21:31.980 に答える
3

実行してみてください:

lshw -class processor | grep -w sse2

プロセッサセクションの下を見てください。

于 2010-11-17T10:38:36.850 に答える