いつもお世話になっております。
KEK の Suiren Blue で開発しているのですが、PZC_TARGET_ARCH=sc1-64 と設定してコンパイルしても、走らせると
device memory usage = -2141716480: exceeds 2GB
というようなエラーが出てしまいます。
デバイスメモリ確保の時点で出ているようです。
回避方法はありますでしょうか。
よろしくお願いいたします。
松古先生
お世話になっております。
PEZY Computingの坂本です。
デバイスメモリ確保の時点でエラーが発生しているということですが、でしたらPZC_TARGET_ARCH変数というよりは、メモリ確保時のサイズに指定している値の問題ではないかと思われます。
-2141716480がログに出ているので、signed intでサイズ計算をされており、オーバーフローが発生しているのではないかと考えられます。
こちらをご確認いただくか、あるいはエラーを再現するコードを添付して頂ければもう少し詳細を確認できるかと思います。
よろしくお願い致します。
坂本様
ご回答ありがとうございます。
確かに signed int を使っていたのですが、 clCreateBuffer を呼ぶ前にサイズを書きだしてみてもオーバーフローはしていなくて、また一度 size_t の変数に変換してから(これも表示すると int の範囲内) clCreateBuffer に渡しても同じ現象が起こります。
なお、返される エラーコードは CL_SUCCESS になっているようです。
現在のコードはかなり大きいので、問題の部分を抜き出したコードを作ってみます。
よろしくお願いいたします。
坂本様
できるだけ不要な部分を除いたコードを作って見ました。
展開すると check というディレクトリができて、そこで make とすれば実行ファイルができます。
API のみでエラーが出るので device kernel はつけていません。
Suiren Blue で go.job_n4.sh を走らせた結果が go.job_n4.log です。
何かお気づきの点がありましたらご教示下さい。
よろしくお願いいたします。
松古様
お世話になっております。PEZY Computingの坂本です。
ソースコードのご提供、ありがとうございました。
こちらでも実行を行ってみました。
松古様のおっしゃるメッセージを確認しましたが、これは、メッセージの所為なのではないかと考えております。
dev_mem_size += size * sizeof(double);
if((double)dev_mem_size > 2.0e9){
printf("device memory usage = %d: exceeds 2GB\n", dev_mem_size);
}
こちらのコードですが、dev_mem_sizeはsize_t型であるため、演算自体は適切に行えているように思われます。
表示上の問題ではありますが、2.0e9、つまりdev_mem_sizeが累計で2GB以上となった場合に下のprintfに突入し、その際の変換指示子が%dであることからsigned intとしてdevice_mem_sizeを表示しているのが現状の問題であると考えられます。
この直前のclCreateBufferでは戻り値のエラーチェックが行われており、こちらではエラーが発生していないようです。pzcl.logにも特にエラーは見受けられません。
ifステートメントをそのまま一度削除またはコメントアウト頂いた状態で、ご所望の結果が得られているか、ご確認頂けますでしょうか?
よろしくお願い致します。
坂本様
大変申し訳ありません。 自分で書かせてたメッセージだと気が付きませんでした ..... お手数をおかけして申し訳ありません。 もう一度何が原因で動かないか確認します。
お忙しいところありがとうございました。
松古
松古様
ご確認ありがとうございました。
この問題は解決したようですが、以前松古様のご所望の動作となっていないようですので、もしご協力できることがありましたらご連絡くださればと思います。
よろしくお願い致します。