熱力学計算のためのOpenCLカーネルの作成が終了し、本当に奇妙なバグが観測されました。 私のカーネルは、次のようになります。レジスタ値のOpenCLの使用がプログラムにクラッシュする
__kernel void energy(... float3 dest, int nlocal, ...){
int i = get_global_id(0);
float3 ev = {0.0f, 0.0f, 0.0f};
for(...){
//some thermo calculations, adding values to evx and evy
ev.x +=...;
ev.y +=...;
}
//Then I want to save the result in dest[i].
//Program exits at next two line
dest[i].x = ev.x;
dest[i].y = ev.y;
私は「マップされていないメモリ」とセグメンテーション違反エラーが発生します。 printfを使用して値を出力しようとしたときに同じエラーが発生します。プログラムが値を読み取ることができないようです。しかし、コンパイラの最適化のために) 別のフロートレジスタ値を使用すると、同じエラーが発生します。しかし、私は
dest[i].x = i/nlocal*3.1f
dest[i].y = ...;
すべてが期待通りに起こっているこのような何か(ev.xまたはev.yの不使用)への最後の行を変更し、私はエラーを取得していない場合。
これはあまりにも動作します:
int i = ...
float3 = {0.0f, ...}
dest[i].x = ev.x;
しかし、それはもはや不可能です何とか実際の計算の後。
プログラムは、Nvidia K40m、Keplerアーキテクチャ上で動作しています。
問題もここになります: 'EV
助けてくれてありがとう、と何かがいななき/ nneighと間違っていることを、あなたの推測では、ミスが上記の投稿のコードではなかったにもかかわらず、正しかったです。 x + = ...; ev.y + = ...; '。 CLコンパイラは出力配列に影響を与えないコードを単純に削除します。再現可能なコード例を投稿してください。それ以外の場合はお手伝いできません。 – DarkZeros
ご協力ありがとうございます、私は自分のコードを変更しました。今はカーネル全体です。 – Noahnder