パズル ゲームでブルート フォース ベースの AI を実行する openCL カーネルを作成していますが、カーネル コードやそれが呼び出す補助関数に問題があります。これが私のカーネル コードです (ここで入力が正しく渡されていると確信しています): 60 は、clEnqueueNDRangeKernel によって設定されたグローバル ワーク サイズです。
カーネルへの入力は次のとおりです。
__global char * in //テスト用のダミー入力
__global char * board_in, // 60 枚のボードを含む大きな char 配列
__global int * lookup, // スコアリング ムーブのスコアをすばやく取得するために使用する配列
出力:
__global char * out, //テスト用のダミー出力
__global int * score_out, // 60 個のスコアの配列: ボードごとに 1 つ
__global int * row_out, // 60 行の配列: 評価されるボードごとに 1 行
__global int * col_out // 60 列の配列: ...
__kernel void helloworld(__global char* in,
__global char* board_in,
__global int* lookup,
__global char* out,
__global int * score_out,
__global int * row_out,
__global int * col_out)
{
int num = get_global_id(0);
char workingBoard[72];
int scoreMat[64];
//set up the array for each thread to use
for(int k=0; k< 72; k++)
{
workingBoard[k] = board_in[num*BOARDSIZE+k];
}
// Make a copy of the score matrix for each thread to use
for(int j=0; j<64; j++)
{
scoreMat[j] = lookup[j];
}
int s=0;
int r=0;
int c=0;
findBestMove(workingBoard,scoreMat,&s,1,&r,&c);
col_out[num] = ?????????
score_out[num] = ???????????
row_out[num] = ???????????????
}
関数 findBestMove は次のように動作します (かなりよくテストされています。私はしばらくの間 CPU 実装で使用しました): ボード (char 配列)、スコア検索配列、移動のスコアへのポインター、現在の深さ、および行と列へのポインター。スコア、行、および列を設定することになっています。同じドキュメントで定義した他の関数を呼び出します。
このコード スニペットを CPU で実行すると、適切な出力が得られます。
// workerBoard and lookuparr are set previous to this to be the same as what
//the kernel thread is supposed to have
int s=0;
int r=0;
int c=0;
findBestMove(workerBoard,lookuparr,&s,1,&r,&c);
cout<<s<<","<<r<<","<<c<<endl;
カーネル コードを実行すると、関数呼び出しを通過しません。関数はカーネルと同じドキュメントで定義されており、動的メモリ、関数ポインタ、再帰、またはグローバル メモリ (カーネル引数の外部) を使用しません。#define ステートメントをいくつか使用します。
????を設定したい 私のカーネルのセクションはr、c、およびsですが、前述のように、そこに到達しません。私は重大な間違いを犯していますか (注: カーネルは私のコードチェッカーと AMD のカーネルアナライザーに合格しています)。また、私はopenCLにかなり慣れていないので、ヒントも大歓迎です。この質問に答えるのに役立つ情報をさらに提供できる場合は、お知らせください。