問題タブ [intrinsics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
703 参照

c++ - char、short の WinAPI _Interlocked* 組み込み関数

char または short で _Interlocked*** 関数を使用する必要がありますが、入力として long ポインターが必要です。関数 _InterlockedExchange8 があるようですが、それに関するドキュメントはありません。これは文書化されていない機能のようです。また、コンパイラは _InterlockedAdd8 関数を見つけることができませんでした。その機能、使用する/使用しないことの推奨事項、およびその他の解決策に関する情報をいただければ幸いです。

更新 1

質問を単純化してみます。どうすればこれを機能させることができますか?

考えられる解決策が 2 つあります

  1. 使用する_InterlockedExchange8
  2. long にキャストanotherし、交換を行い、結果を X にキャストします

最初のものは明らかに悪い解決策です。2 番目の方が見栄えが良いですが、どのように実装しますか?

更新 2

このようなことについてどう思いますか?

ありがとう。

0 投票する
10 に答える
1508 参照

c++ - 半精度float16から単精度float32への変換を最適化するにはどうすればよいですか?

関数のパフォーマンスを改善しようとしています。プロファイラーは、内部ループのコードを指します。おそらくSSE組み込み関数を使用して、そのコードのパフォーマンスを向上させることはできますか?

アップデート:

分解

0 投票する
4 に答える
2746 参照

c++ - インラインアセンブリの代わりにx64の「カスタム組み込み」機能は可能ですか?

私は現在、私のライブラリ用に高度に最適化された再利用可能な関数の作成を試しています。たとえば、関数「2 のべき乗」は次のように記述します。

これは、インライン C++ テンプレートとして移植可能でメンテナンスの少ない実装です。このコードは、VC++ 2008 によって次の分岐付きコードにコンパイルされます。

ここからの実装も見つけました: "The bit twiddler"。これは、x64 のアセンブリで次のようにコーディングされます。

アセンブリ モジュール (.asm ファイル) で C++ とは別に記述された両方のサブルーチンをテストしました。

しかし、関数呼び出しのオーバーヘッドはかなりのものです。2 番目のアセンブリ実装 "is_power_of_two_fast" をテンプレート関数のインライン バージョンと比較すると、後者は分岐にもかかわらず高速です!

残念ながら、x64 の新しい規則では、インライン アセンブリは許可されないと指定されています。代わりに「組み込み関数」を使用する必要があります。

ここで質問です:インラインで使用できるように、より高速なバージョンの「is_power_of_two_fast」をカスタム組み込み関数または同様のものとして実装できますか? または、代わりに、何らかの方法でコンパイラに関数の低分岐バージョンを生成させることは可能ですか?

0 投票する
2 に答える
1676 参照

c++ - コンパイラーはSSE(または任意の)組み込み関数をどのように扱いますか?

少し前に、コンパイラが通常の関数とは異なる方法で処理するため、SSE組み込み関数が効率的なマシンコードにコンパイルされることをどこかで読みました。私は実際にコンパイラーがそれをどのように行うのか、そしてCプログラマーがプロセスを容易にするために何ができるのかをさまよっています。効率的なマシンコードを生成するコンパイラの仕事を容易にする方法で組み込み関数を使用する方法に関するガイドラインはありますか?

ありがとう。

0 投票する
1 に答える
321 参照

visual-c++ - Visual C++ で SSE2 組み込み関数を削除する

ソースからすべての SSE2 組み込み関数を削除する方法を知っている人はいますか? (Visual C++ で) 私は SSE2 を使用しているので、おそらくいくつかの場所にいくつかあります。ここで、プロジェクトを再び SSE に移行したいと思います。1 回のコンパイルでそれらを見つけるために何かを #define できるかどうか疑問に思います。

ヘンデルとネクロリスの助けをありがとう

私は実際に手動で find "_mm_"... sort... を実行し、それぞれを調べました。

0 投票する
2 に答える
572 参照

fortran - 標準に含まれていない FORTRAN 組み込み関数はどうすればよいですか?

gfortranを使用してソースからビルドすることにより、レガシーFORTRANコードを機能させようとしています。ようやく正常にビルドできましたが、実行時に範囲外エラーが発生します。私は gdb を使用し、エラーを loc() 組み込み関数を使用する関数まで追跡しました。渡された整数値 ae を使用して の値を出力しようとすると、loc(ae)「現在のコンテキストにはシンボル "loc" がありません」というエラーが表示されます。ifort 11.x でコンパイルを試み、DDT でデバッグしたところ、同じエラーが発生しました。私にとって、これはコンパイラが組み込みについて何も知らないことを意味します。

少し読んだだけで、loc 組み込み関数が F77 標準の一部ではないことが明らかになったので、それが問題の一部である可能性があります。以下に組み込みの定義を投稿しましたが、それをコードに実装する方法がわからないため、loc() を使用できます。

アドバイスはありますか、それとも私の問題を誤解していますか? gfortran と ifort の両方が範囲外エラーのために同じ場所でクラッシュしますが、loc() を使用する関数は両方のコンパイラ間で同じ大きな数を返すためです。両方のコンパイラが loc に対して同じ値を返すと、 loc() が機能しないというのは少し奇妙に思えます。

使用法:

iaddr = loc(obj)

どこ:

obj は、アドレスが必要な変数、配列、関数、またはサブルーチンです。iaddr は、「obj」のアドレスを持つ整数です。アドレスは、LARn 命令によって格納されるものと同じ形式です。

説明:

LOC は、何かのアドレスを取得するために使用されます。返される値は Fortran 内ではあまり役に立ちませんが、GMAP サブルーチンや非常に特殊なデバッグに必要になる場合があります。

0 投票する
2 に答える
1386 参照

c - SSE4.1 組み込み関数を使用したバイリニア フィルター

組み込み関数の使用に慣れるための演習として、一度に 1 つのフィルター処理されたサンプルに対して、かなり高速なバイリニア フィルター処理関数を見つけようとしています。SSE41 までは問題ありません。

これまでのところ、次のものがあります。

このコードは、画像データが ARGB8 であり、分岐せずに特殊なケースを処理するための追加の列と行があることを前提としています。

私は、このぎこちない混乱のサイズを小さくするために使用できる指示と、より速く実行するためにどのように改善できるかについてアドバイスを求めています!

ありがとう :)

0 投票する
2 に答える
750 参照

c - SSE2値抽出問題

128 ビット レジスタから値 (最初のワード 16 ビット) を抽出したい。最終的に変更されます 最初の単語を抽出したい...どうすればこれを行うことができます...

0 投票する
3 に答える
3267 参照

c++ - SSE組み込み関数のif/elseステートメント

私はSSE組み込み関数を使用して小さなコードを最適化しようとしています(私はこのトピックの完全な初心者です)が、条件の使用に少し固執しています。

私の元のコードは次のとおりです。

このコードの目的は、crcテーブルを計算することです(定数は任意の多項式にすることができ、ここでは役割を果たしません)、

最適化されたコードは次のようになると思います。

if-elseステートメントをどのように処理するかはわかりませんが、巧妙なトリックがあるのではないかと思います。誰かがそれを行う方法についてのアイデアを持っていますか?

(これを除けば、私の最適化はおそらくかなり貧弱です-それに関するアドバイスや修正は最大の共感で扱われます)

0 投票する
1 に答える
818 参照

c - _mm_cmpistrmSSE4.2組み込みのモード

_mm_cmpistrmSSE4.2組み込みの「モード」フラグを設定する方法を理解しようとしています。_mm_lddqu_si128を使用して__m128iタイプにロードしている通常のC文字列(char *)があります。通常の文字列比較で符号なしバイトを使用する予定でした。

しかし、ユニットとビットマスクの設定について混乱しています。GCC4.3.2のsmmintrin.hのマクロは次のとおりです。

私はビットマスクが何であるかを理解していると思います。その位置の文字が2つの文字列間で異なる場合、ビット0..15で1を取得します。しかし、ユニットマスクは何をしますか?