2012-01-13 14 views
15

次の2行の違いは何ですか?言い換えれば_mm_load_ps vs. _mm_load_pd vs.

__m128 x = _mm_load_ps((float *) ptr); 
__m128 y = _mm_load_pd((double *)ptr); 

、なぜこれほど多くの異なる_mm_load_xyzの指示ではなく、一般的な__m128 _mm_load(const void *)で、ありますか。 4つの単精度浮動小数点は2倍精度浮動小数点が

これらが異なることを行うので、私はそれだけで異なる機能を持っていることは理にかなって考えて値

_mm_load_pd負荷値

+3

'_mm_load_pd'の戻り値の型は' __m128'ではなく '__m128d'です –

+0

@PaulR:これは....世界ではすべての意味があります。私は全く気付かなかった。それを指摘してくれてありがとう。 :) – Mehrdad

答えて

13

異なる組み込み関数は、異なる命令に対応しているため、異なる組み込み関数があります。

インテルは、倍精度ベクタが単精度ベクタまたは整数ベクトルとは異なる物理レジスタファイルによってバックアップされているプロセッサを設計したり、異なる実行単位を使用したりすることを自由にしたいためです。データが適切なレジスタファイルまたは転送ネットワークにロードされるように指定する方法がない場合、これらのいずれかが追加のレイテンシを追加する可能性があります。

さまざまな命令が「同じこと」を行うが、ロードされているデータが将来の命令によってどのように使用されるかをプロセッサに示唆するヒントが追加されています。これは、プロセッサが、データができるだけ効率的に使用される正しい場所にあることを確認するのに役立ち、プロセッサによって無視される可能性があります。

これは単なる仮説ではありません。浮動小数点演算で消費されるデータをロードするために整数ベクトル・ロード(MOVDQA)を使用するプロセッサには、浮動小数点演算のデータを得るために浮動小数点ロードを使用するよりも時間がかかります(逆も同様です) 。このテーマの詳細については、「Intel Optimization Manual」またはAgner Fogのノートを参照してください。将来的にこのようなパフォーマンスの危険性を避けるために、データの使用方法に合った負荷を使用してください。

+0

おっと、気にせず、私は間違っていました。戻り値のタイプは異なります。それは今、完全に意味をなさない。 :) +1ありがとうございました。 – Mehrdad

+0

@Mehrdadこれは、昨日のあなたのSSE質問で言及したのと同じドメインシャッフルのことです。 – Mysticial

3

_mm_load_psロード。また、Cでは、オーバーロードはありません。

+0

私よりも良い説明:) –

+0

これは単なるセマンティクスの問題であり、CPU関連の問題ではありません。 – Mehrdad

+0

@Mehrdad、ここでは組み込み関数を使用しているので、これらの関数は実装が異なる可能性があります。一般化はできません。 –

関連する問題