2016-07-04 7 views
0

熱力学計算のための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アーキテクチャ上で動作しています。

+0

問題もここになります: 'EV

int numneigh = nneigh[i] (stands for number of neighbors) is correct in the original code I did this: int numneigh = neigh[i] (the neighbors) 

助けてくれてありがとう、と何かがいななき/ nneighと間違っていることを、あなたの推測では、ミスが上記の投稿のコードではなかったにもかかわらず、正しかったです。 x + = ...; ev.y + = ...; '。 CLコンパイラは出力配列に影響を与えないコードを単純に削除します。再現可能なコード例を投稿してください。それ以外の場合はお手伝いできません。 – DarkZeros

+0

ご協力ありがとうございます、私は自分のコードを変更しました。今はカーネル全体です。 – Noahnder

答えて

1

これはあなたのコード内の疑わしい:あなたは、neighにポインタの配列を渡し、その後、ポインタを取得し、それを使用しているよう

kernel(... __global int* neigh 
    __global int* neighs = neigh+i; 
    ... 
    int j = neighs[k*n]; 
    ... 

は思えます。 ポインタを渡すと、CLでポインタが許可されず、GPUメモリからアドレス指定されているため、クラッシュします。

あなたのベクトルは単に適切に計算されていない、サイズがなければならないことも可能である:(覚えて、彼らは浮いている、とするfloat3あなたは、彼らがあるべきよりも小さいバッファを作成しました

res, nneigh = GLOBAL_SIZE 
neighs = max(nneigh[])*n 
x = max(neighs[]) 

も可能これは要素あたり32ビットと128ビットを使用します)。 CL API呼び出しは、要素ではなくバイトで定義されます(sizeof()を使用する必要があります)。

+0

私はsegfaultを引き起こした問題を発見したと思います。私はsizeof(numneigh)を2回、sizeof(neigh)ではなく通過しました。今私はEv.xまたはev.yを使用すると、OutOfResourcesエラーが発生します。 – Noahnder

+0

_これは、あなたが隣にポインタの配列を渡して、ポインタを取得してそれを使用しているようなものです。私にとってこれは2Dの平坦な配列にアクセスするような感じです。 @Noahnder既に述べたように、OpenCLバッファのサイズに何か問題があるはずです。 resに他の値を書き込むと、コードの残りの部分が最適化され、基本的にそれを使用していないので、問題は消えます。 – doqtor

+0

@doqtor要素iへのポインタを取得し、それを再びメジャーディメンションでオフセットするのではなく、 'neighs [k * n + i]'を使用する方がより論理的です。不自然なようだ。それで、私はおそらく、彼は 'neighs'にポインタの配列を持っていて、コンパイルするためにそれをやっていたのではないかと推測しました。 私はこれらの種類の問題をデバッグするためにホストコードが必要であることに同意します。 – DarkZeros

0

私は答えを見つけ、上記のコードが動作しています。カーネルのパラメータを変更して理解を深め、ここにコードを投稿したときに間違いを修正しました。 P

関連する問題