none
Microsoft Accelerator v2 C++ Cond演算を使用した時に発生するエラーについて RRS feed

  • 質問

  • 始めて投稿させて頂きます。どうぞよろしくお願いします。

    パソコン(32bitのものを利用)の環境はMicrosoft Visual Studio 2010 C++ Expressで AcceleratorのSDK packageをダウンロードし、利用しております。

    最近Microsoft Accelerator v2の勉強を始めました。C#ではなくC++のAPIを利用しています。

    今回Cond演算によって生成されるParallelArrayObjectを、元の配列に変換するまでのプログラムを作成しました。

    しかしながら実行してみると、Debug Error. Abort() has been called. と出てしまいます。

    以下がそのコードの一例です。

     

        DX9Target *tgt = CreateDX9Target();      //ターゲット   

        size_t dims[2] = {2,2};                             //次元

        int input[2][2] = {{1,2},{3,4}};               //入力配列

        int output[2][2];                    //出力配列

        IPA InArray = IPA(*input,2,2);                   //入力のParallelArrayObject

        IPA Threshold = IPA(2,dims,2);                  //閾値として利用するParallelArrayObject

        IPA Zero = IPA(0,dims,2);                          //全要素が0のParallelArrayObject

        //  cond 演算

        IPA OutArray = Cond(CompareGreaterEqual(InArray,Threshold),Threshold,Zero);

       // ParallelArrayobjectから配列への変換 

        tgt->ToArray((IPA)OutArray,(int*)output,2,2,2*sizeof(int),ExecutionModeNormal);

     

    ParallelArrayObjectのIPA型であるOutArrayから、int型であるoutputへの変換でエラーが発生しております。次元とデータタイプが同じであれば問題ないと思っていたのですが、エラーが発生してしまい困っております。

     

    試しに最後の行の(IPA)OutArrayを(IPA)InArrayや(IPA)Thresholdに変えて実行してみると、正しく動作するみたいです。

    Cond演算が問題なのかと思い、ここ1週間ほど解決策を探していたのですが、自分の力だけではどうにもならず解決出来ませんでした。

     

    今回助言を頂ければと思い投稿しました。どうぞよろしくお願いします。

     

     

     

     

    2011年10月12日 2:28

回答

  • Accelerator 自体素人なので役に立つかは解らないですが、興味深い内容だったので返信してみます。

     

    SDKの資料を少し読んでみた限りで気になったことですが、
    エラー内容は例外ですよね?
    例外の理由文字列が 「Debug Error. Abort() has been called.」の文字列を返しているのでしょうか?

    もし例外をハンドリングしていないのなら、
    ハンドルして理由文字列を表示してみるべきだと思います。

    Programmers Guide の Error Handling の文章内に、

    After you have called ToArray , targets can throw exceptions if you bound an incorrectly sized data -parallel array object to a parameter object .

    と記述されているので、
    Cont演算が動的配列を返していて固定配列への展開を拒否されているような気がします。

     

    • 回答としてマーク YYXXYY 2011年10月17日 22:50
    2011年10月15日 12:22

すべての返信

  • Accelerator 自体素人なので役に立つかは解らないですが、興味深い内容だったので返信してみます。

     

    SDKの資料を少し読んでみた限りで気になったことですが、
    エラー内容は例外ですよね?
    例外の理由文字列が 「Debug Error. Abort() has been called.」の文字列を返しているのでしょうか?

    もし例外をハンドリングしていないのなら、
    ハンドルして理由文字列を表示してみるべきだと思います。

    Programmers Guide の Error Handling の文章内に、

    After you have called ToArray , targets can throw exceptions if you bound an incorrectly sized data -parallel array object to a parameter object .

    と記述されているので、
    Cont演算が動的配列を返していて固定配列への展開を拒否されているような気がします。

     

    • 回答としてマーク YYXXYY 2011年10月17日 22:50
    2011年10月15日 12:22
  • kyano30さんご返信どうもありがとうございます。

     

    おっしゃられていたように、エラー内容が例外であったためError Handlingを行ってみた所、

    "Not supported operation for the used target."と表示されました。

     

    そこで、DX9Targetがinteger型をサポートしていないのか?と思い、64bitのパソコンを借りてtagetをX64MulticoreTargetに変更し、再び実行してみると正しく実行する事が出来ました。また、integer型ではなくfloat型ならばDX9Targetでも実行を確認する事ができました。結果的に、DX9Targetの場合はinteger型でのCond演算等がサポートされていなかったみたいです。

    今回はアドバイスを頂きありがとうございました。大変助かりました。

    2011年10月17日 22:50
  • Accelerator_Intro.docxに

    DirectX 9 does not provide native integer support, so the DirectX 9 target does not support the ToArray overloads that evaluate IntParallelArray objects.

    A GPU target using DirectX 11. This target would directly support integer operations.

    という記述がありました。Windows Vista SP2、Windows 7以降なら32bitでもintegerが使えそうです。

    2011年10月18日 0:25
  • 佐裕理さん、ご返信ありがとうございます。

     

    確かに、Accelerator_Introの方で上記の方の記述を確認しました。目は通したつもりでいたのですが、見落としていました。これからは注意したいと思います。

     

    この用件で、もう一度32bitでintegerが使えるか試してみたいと思います。アドバイスをありがとうございました。

     

    2011年10月19日 1:19