• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ARMプロセッサ,NEONの並列化について)

ARMプロセッサ,NEONの並列化について

このQ&Aのポイント
  • ARMプロセッサのNEONを用いてプログラムの並列化を試みていますがうまくいきません...一般的なCソースに対してループ内の配列に"__restrict"をつけて,遅くなってしまいます.またアセンブラを見てもNEON固有の命令が見つかりません.
  • NEONを用いたARMプロセッサの並列化についての質問です.NEONを使ったループ内の配列演算に"__restrict"をつけることで遅くなってしまいます.またアセンブラを確認したところ,NEON固有の命令が見つかりませんでした.どなたか解決策を教えていただけると助かります.
  • ARMプロセッサのNEONを使用したプログラムの並列化について質問です.NEONを使ったループ内の配列の演算に"__restrict"をつけると逆に遅くなってしまいます.アセンブラも確認したのですが,NEON固有の命令が見当たりません.どなたか原因や解決策をご教示いただけると幸いです.

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

> この場合,ポインタの初期化を行う必お湯はありますでしょうか. ポインタって、vmla()の中のa, x, y, zのことを指して言っていますか? もしそうなら、これらの変数はvmla()が呼ばれたときに値が既に与えられています。 その値をそのまま使いたいのであれば&pを代入する必要はありませんし、元の値を捨てて別のポインタで演算をしたいのであれば質問中にあるように改めて初期化する必要があります。 vmla()で何をやりたいのかは質問者さんにしか分かりません (とは言え、&pを代入するのはきっと間違っているだろうとは推測できます)。 もう一点気になるのはコンパイルオプションです。 http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.htmlを見ると-mhard-floatは-mfloat-abi=hardと同じ意味と書かれていますから、それと-mfloat-abi=softfpを同時に指定するのは矛盾していて意味がありません。

kukky
質問者

補足

返答どうもありがとうございます. おっしゃる通り,値が与えられますね. そもそもポインタの初期化をした理由は はじめにSegmentation faultしたためです. 原因を調べた際に,初期化をしないと ポインタが示すアドレスがかぶることがある云々 とあったためです. しかしすべてに&pではまずいですね. この場合は必要ないということでしょうか. ちなみに返答にありました通り,初期化をコメントアウトして 行いましたがどうも並列化の恩恵はありませんでした. また,オプションに関してですが,今回のgccが まだ-mfloat-abi=hardをサポートしていないため -mfloat-abi=softfpを指定しております. http://blog.kmckk.com/archives/1565251.html -mhard-floatをつけると暗黙のうちに -mfloat-abi=hard になりますが、現状ARMのコンパイラではfloatのABIでhardはサポートされていません。なので、必ず -mhard-float を指定したら -mfloat-abi=softfp も指定する必要があります。 次にでてくるgcc 4.5 ではARMでの-mfloat-api=hardがサポートされるようです。

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

並列化どうこうの前に、vmla()の内容が間違っています。 a, x, y, zが全てpへのポインタで上書きされていて、main()で準備したa_val, x_val, y_val, z_valはvmla()での計算に使われていません。 pは配列ではないので、i≠0のときx[i]やa[i]にアクセスするのは正しくありません。

kukky
質問者

補足

返答ありがとうございます. 確かにvmlaがすべて上書きされてしまいますね... この場合,ポインタの初期化を行う必お湯はありますでしょうか. またある場合はvmlaの中にかいてはおかしいでしょうか?

関連するQ&A