問題タブ [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.
c++ - SSE Intrinsics の符号ビットを比較する
たとえば、a が [1.0 -1.0 0.0 2.0] で b が [1.0 1.0 1.0 1.0] の場合に a と b を比較する場合、2 つのパックされた float (__m128's) の符号が同じかどうかを示す SSE 組み込み関数を使用してマスクを作成するにはどうすればよいでしょうか。得られる望ましいマスクは [true false true true] です。
visual-c++ - Visual C++ に組み込まれている 128 ビット除算
Visual C++ には本当に 128 ビット除算の組み込み関数がないのでしょうか?
と呼ばれる 64x64=128 ビットの乗算組み込み関数があり、これはx64 アセンブラー命令_umul128()
とうまく一致します。MUL
当然のことながら、128/64=64 ビットの除算組み込み (DIV
命令のモデル化) もあると思いましたが、驚いたことに、Visual C++ も Intel C++ もそれを持っていないようで、少なくとも intrin.h にはリストされていません。
誰かがそれを確認できますか?コンパイラの実行ファイルの関数名をgrepしてみましたが、そもそも見つからなかっ_umul128
たので、探し方を間違えたのでしょう。
更新: 少なくともumul128
、Visual C++ 2010 の c1.dll でパターン (先頭のアンダースコアなし) を見つけました。他のすべての組み込み関数はその周りにリストされていますが、残念ながら「udiv128」などはありません:(それを実装することを「忘れて」います。
明確にするために:私は128ビットのデータ型を探しているだけでなく、C++で128ビットのスカラーintを64ビットのintで割る方法も探しています。組み込み関数またはネイティブの128 ビット整数サポートのいずれかが問題を解決します。
編集:答えはノーです_udiv128
。Visual Studio 2010 から 2017 までの組み込み関数はありませんが、Visual Studio 2019 RTM で利用できます。
x86 - AVX2 の _mm_alignr_epi8 (PALIGNR) に相当
SSE3 では、PALIGNR 命令は次のことを実行します。
PALIGNR は、デスティネーション オペランド (第 1 オペランド) とソース オペランド (第 2 オペランド) を中間コンポジットに連結し、バイト粒度でコンポジットを定数即値分だけ右にシフトし、右揃えの結果をデスティネーションに抽出します。
私は現在、SSE4 コードを移植して AVX2 命令を使用し、128 ビットではなく 256 ビット レジスタに取り組んでいる最中です。単純に、組み込み関数_mm256_alignr_epi8
(VPALIGNR) が 256 ビット レジスタに対してのみ同じ操作を実行すると信じていました_mm_alignr_epi8
。残念ながら、そうではありません。実際、_mm256_alignr_epi8
256 ビット レジスタを 2 つの 128 ビット レジスタとして扱い、隣接する 2 つの 128 ビット レジスタに対して 2 つの「整列」操作を実行します。と同じ操作を効果的に実行します_mm_alignr_epi8
が、一度に 2 つのレジスタに対して実行します。ここに最も明確に示されています: _mm256_alignr_epi8
現在、私の解決策は、次のよう_mm_alignr_epi8
に、ymm (256 ビット) レジスタを 2 つの xmm (128 ビット) レジスタ (上位と下位) に分割して使用し続けることです。
これは機能しますが、もっと良い方法があるはずですよね? 同じ結果を得るために使用する必要がある、おそらくより「一般的な」AVX2命令はありますか?
c++ - VisualStudio11開発者プレビューでのBitScanForward64の問題
私はCで何かを書くのはまったく初めてです。バイナリ操作を実行するヘルパーDLL(C#から呼び出される)を書いています。'識別子"BitScanForward64"isundefined'エラーが発生します。32ビットバージョンが利用可能です。これは、Win32DLLを作成したためだと思います。
その後、64ビットバージョンは特定の64ビットDLL(新しいプロジェクトウィザードでは「一般」と想定)でのみ使用可能であり、32ビットと64ビットの別個のdllが必要になる可能性があることに気づきました。これは事実ですか、それともBitScanForwardとBitScanForward64の両方の組み込み関数を実行する単一のDLLを使用できますか?その場合、どのように作成しますか?
これが私の現在のコードです:
c++ - C 数学関数の MSVC 組み込み/組み込み関数の呼び出し
GCC と Clang の場合、これは簡単に実行できます。
これは魅力のように機能します。ほとんどすべての数学関数に対して同様のことを行い、コードを MSVC でも動作させたいと考えています。MSVCで上記と同等のことを行うにはどうすればよいですか?
編集:明確にするために:質問は__builtin_*
関数に関するものであり、他には何もありません。私は試した
しかし、これには abs 関数の宣言が必要です。これは、グローバル名前空間には入れたくないものです。
c++ - SSE組み込み関数-if/else最適化の比較
私は生のピクセルデータを処理するいくつかのコードを最適化しようとしています。現在、コードのC ++実装は遅すぎるので、MSVC 2008でSSE組み込み関数(SSE / 2/3は4を使用しない)を使用していくつかの根拠を作ろうとしています。いくつかの良い進歩を遂げました。
残念ながら、私は立ち往生している特定のコードに到達しました:
現在、このセクションではデフォルトでC ++実装を使用しています。これは、SSEを使用してこれを最適化する方法について頭を悩ませることができないためです。比較のためのSSE組み込み関数は少し注意が必要です。
任意の提案/ヒントをいただければ幸いです。
編集: 一度に1つのピクセルを処理する同等のC++コードは次のようになります。
基本的に、4:3から16:9までの非線形エッジストレッチを実行しています。
c++ - InterlockedExchange VisualStudio2010固有
コンパイラの最適化設定で組み込み関数を有効にしていますが、InterlockedExchangeの結果のコードは、インラインアセンブリを生成するのではなく、kernel32.dllへの呼び出しを生成しています。この機能はVistaより前のバージョンのWindowsでは使用できないため、これは特に問題があります。
MSDNのドキュメントには、「この関数は、可能な場合は組み込みのコンパイラを使用して実装されます」と記載されています。コンパイラにInterlockedExchangeの実際の組み込みコードを使用させることは可能ですか?
gcc - SSE2組み込み関数とgccインラインアセンブラの両方を使用する
SSE2組み込み関数とインラインアセンブラをgccでミックスしようとしました。しかし、変数をxmm0 / registerとして入力として指定すると、場合によってはコンパイラエラーが発生します。例:
gccバージョン4.6.1でコンパイルすると、次のようになります。
奇妙なことに、他の入力変数/レジスタがある場合、突然xmm0が入力として機能しますが、xmm1などは機能しません。また、別のケースでは、xmm0〜xmm4を指定できましたが、上記は指定できませんでした。これについて少し混乱/イライラ:S
ありがとう :)
c++ - SSE 組み込み関数により、通常の float 操作は -1 を返します。#INV
私が書いているオーディオ処理を実行する SSE メソッドに問題があります。ここにある Intel の論文に基づいて、SSE ランダム関数を実装しました。
また、SSE を使用して Float から S16 への変換を実行するメソッドもあります。変換は次のように非常に簡単に実行されます。
FloatRand4 は次のように定義されます。
結果が返され、sseresult != NULL
未使用の場合。これは最初のループでは完全に機能しますが、次のループでは. 行をコメントアウトすると、問題はなくなります。__m128
result
delta
-1.#INF
1.0
__m64 con = _mm_cvtps_pi16(in);
FPUが不明な状態になっていると思います。
c++ - SSE 命令セットが有効になっていません
「SSE instruction set not enabled」というエラーで問題が発生しています。どうすればこれを理解できますか?
私はACER i7、Ubuntu 11.10を持っています。誰か助けてください。
どんな助けでも大歓迎です!
また実行中:
与えます:
実際、gazebo-1.0.0-RC2-x86_64 をインストールしようとして、このエラーが発生しました。
私のcmakefileにはすでにこのオプションがあります