8年前お世話になります。SIMDプログラミングを勉強しはじめたのですが、エラーの原因がわからず悩んでいます。助言いただけると助かります。Win32API以下サイトを参考に、ビットマップ画像の加工処理(色反転)の最適化・高速化を試すプログラムを作りました。http://d.hatena.ne.jp/komugi_com/20080323/1206249192しかし実行したところ、イントリンシック命令(関数)のところでアクセス違反の例外が発生してしまいます。ポインタの値が不正になっているようには見えず、原因がわかりません。長いですが、プログラムを貼らせていただきます。ここで例外が発生します。問題なく動作しています。msg.wParam;}なお、アセンブラの知識は、書籍「はじめて読む8086」をざっと一読した程度です。自分でニーモニック記述のコードを書いたり、コンパイラの作る中間ファイルを眺めるといったことはまだできないレベルです・・。書き忘れたことがありましたので追記します。サポートしていると出ます。命令だから使えるはず・・と思っています。以下の自作SSE2テストプログラムは動作することを確認しています。すみませんが、原因というか例外発生のきっかけ?が判明したかもしれません。イントリンシック関数に渡してはいけないのでしょうか?同じような例外が発生するパターンを見つけました。例外が発生してしまいます。使ってメモリ確保すれば動きます。0;}不思議なのですが、静的な配列なら問題なく動くように見えます。0;}これはいったいどういう事なのでしょうか・・・。バイトアラインメントになっている必要があります。16ビットアラインメントとは、操作するデータのあるアドレス値が16の倍数(16進数で1桁目が常に0)である必要があるということです。それに合わないデータを渡すと例外が発生します。(偶然16バイトアラインメントになって)通ることがあるでしょうし、逆にローカル変数で例外が発生する時があるでしょう。自前で16バイトアラインメントに合わせる様にオフセットして使用するかのどちらかにする必要があります。御津凪さん、ありがとうございます。メモリのアライメントとは、アドレス値のことだったんですね。そんな制約があるとは想像できず、入門サイトにも書いてありましたがスルーしてました・・勉強になりました。HeapAllocでも、15バイト余分に確保した上で、16バイト境界のアドレスを使うようにしたら、ちゃんと動作しました。系のWin32APIは存在しないんでしょうか・・。使っておきたいと思います。ローカル変数が問題なかったのは、たまたま16バイト境界のアドレス値になっていたからなんですね。いうのをつけて定義すべき、というのも知りました。解決とさせて頂きます。ありがとうございました。系のWin32APIは存在しないんでしょうか・・。使っておきたいと思います。VirtualAllocはページ単位でメモリを確保するAPIでページ境界(64KB)にアラインメントされます。内部でVirtualAllocを呼び出していると思われます。8年前ISLeさんありがとうございます。遅い返信ですみません。VirtualAllocは、名前は聞いたことありましたが、アライメントの事は気づきませんでした。64KBブロック(ページ)単位で確保されるということは、アドレス値も64KBアライメントになる、ということなんですね。使ったことがなかったですが、ピクセルデータをVirtualAllocで確保すると都合がよい、という単純な使い道でもいいのかな。ありがとうございました。ミクプラは自由にリンクできます。