質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2834閲覧

AVX命令をデバッガでステップ実行すると結果が異なる理由を知りたい

kazuccho

総合スコア11

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2グッド

1クリップ

投稿2016/01/30 15:58

編集2016/01/30 18:31

実行環境
Windows 10 Home 64bit
Intel Core i7-6700K
Visual Studio Community 2015 Update1

質問概要
AVX命令(_mm256_set_pd)を使用した場合、デバッガにアタッチしている状態で
ステップ実行をすると結果が異なる理由が知りたいです。

以下のようなコードがあるとします。

C++

1__m256d v; 2v = _mm256_set_pd( 4.0, 3.0, 2.0, 1.0 );

該当コードをステップ実行しない場合は以下のような期待通りの結果を得ることができます。

v.m256d_f64[0]: 1.0
v.m256d_f64[1]: 2.0
v.m256d_f64[2]: 3.0
v.m256d_f64[3]: 4.0

しかし、ブレイクポイントを張って該当コードをステップ実行で見ていくと、結果が以下のようになります。

v.m256d_f64[0]: 1.0
v.m256d_f64[1]: 2.0
v.m256d_f64[2]: 0.0
v.m256d_f64[3]: 0.0

上位128bitの値がゼロクリアされた結果が返ってくるようで、
他の命令(_mm256_load_pdなど)でも同じような挙動をします。

デバッガのウォッチの不具合かと思い値を出力したりレジスタをのぞいたりしましたが、
やはりステップ実行を行うと上位128bitはゼロクリアされていることは間違いないようでした。

コンパイル時、実行時には警告やエラーはありません。
浮動小数点モデルなどの各種コンパイルオプションもいくつか変更して動作確認をしましたが挙動似変化はありませんでした。

ステップ実行さえしなければ正しい挙動になっているようなので最終的なリリース時には問題ないのですが、
デバッグが困難ですのでできれば解決したいところです。

よろしくお願いいたします。


thom.jpさんのアンサーで解決できました。

デバッガでのブレイクポイント中断とステップ実行でも問題なく__m256d変数へのAVX命令の結果が得られました。
技術メモ&同じ問題に遭遇された方へのヒントとして、簡単にですが下記にその手段を残しておきます。

  1. Intel SDEの取得とインストール

ダウンロードページから以下の2つを取得し、それぞれ展開・インストールする。
・Intel SDE拡張機能
sde-msvsyyyy-x.x.x.msi
インストーラの指示に従い、Visual Studioに拡張機能をインストールする
・Intel SDE Kit
sde-external-x.xx.x-yyyy-mm-dd-win.tar.bz2
適当なディレクトリに解凍する
※展開されたファイルのうち、アンチウィルスソフトに誤検知される可能性のあるものが含まれているため
必要に応じて対応する(信頼リストへの追加など)

  1. Visual Studioの設定

オプション → Intel(R) SDE Debuggerの設定項目にあるSDE Kit Directoryに先ほど展開したSDE Kitを設定する。

  1. デバッガの切り替え

デバッガをSDE Debuggerに切り替える。
※通常のC++アプリケーションをデバッグする際はローカルWindowsデバッガーになっている。

  1. デバッグ開始

デバッグを開始すればSDE Debuggerがプロセスを起動してデバッグを開始する。

KoichiSugiyama, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

専門外ですが、それらしい情報があったので何かしらヒントになれば。

海外の掲示板ですが、VSのデバッガが特定メモリを上書きしてしまう可能性について言及されていました。

VS2010 - Breakpoint generates "Illegal Instruction" exception

VS debugger should have overwritten that memory location with one 0xCC and two 0x90 instruction and failed

あと、Intel SDEが要るようなのですが、最新版が入ってるのでしょうか。
Debugging Applications with Intel ® SDE

An extension to the standard MSVS disassembly window that knows about the new instructions. You can set breakpoints and single-step over new instructions.

投稿2016/01/30 16:46

thom.jp

総合スコア686

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuccho

2016/01/30 18:12

Intel SDEの導入により解決ができました。 ありがとうございました! 専門外ということですが、どちらのURLにも今の私に非常に有用な情報が書かれていました。
thom.jp

2016/01/30 18:47

的外れでなくて安心しました。 解決したようでなによりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問