0

プログラムをファイルにキャッシュして、アセンブリにコンパイルする必要がないようにしようとしています。その結果、私はバイナリをダンプしようとしています。交互に返されるバイナリプログラムの最後にガベージデータがあるという問題が発生しています。

わかりやすくするためにエラーチェックは省略されています(ただし、エラーは発生しません)。

clGetProgramInfo(kernel->program, CL_PROGRAM_BINARY_SIZES, 0,NULL, &n);
n /= sizeof(size_t);

size_t* sizes = new size_t[n];
clGetProgramInfo(kernel->program, CL_PROGRAM_BINARY_SIZES, n*sizeof(size_t),sizes, NULL);

kernel->programが時間の間で同一であることを確認しました。上記のコードでは、「n」は常に1ですが、sizes[0]は2296から2312の交互の実行の間で変化します。

問題は、2296の数値がより正確に見えることです。出力の最後の閉じ中括弧の後に、3つの改行と3つのスペースがあります。

2312番号の場合、出力の最後の閉じ中括弧の後に、3つの改行、1行のガベージ・データ、そして3つのスペースがあります。

当然、ガベージデータの行には問題があります。私はそれを取り除く方法がわかりません、そして私はそれが私の側のエラーではないと確信しています。

NVIDIA GeForce GTX 580M、Windows7のドライバー305.60。

更新:コードを次のように変更しました:

//Get how many devices there are
size_t n;
clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, 0,NULL, &n);

//Get the list of binary sizes
size_t* sizes = new size_t[n];
clGetProgramInfo(kernel->program, CL_PROGRAM_BINARY_SIZES, n*sizeof(size_t),sizes, NULL);

//Get the binaries
unsigned char** binaries = new unsigned char*[n];
for (int i=0;i<(int)n;++i) {
    binaries[i] = new unsigned char[sizes[i]];
}
clGetProgramInfo(kernel->program, CL_PROGRAM_BINARIES, n*sizeof(unsigned char*),binaries, NULL);

現在、コードのn = 4ですが、sizes [0]のみに意味のある情報が含まれています(したがって、sizes [1]の割り当てはループで失敗します)。考え?

4

3 に答える 3

1

次の行でデバイスの数を取得します。

clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, sizeof(cl_uint), &n, NULL);

于 2013-03-21T15:39:37.537 に答える
0
clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, 0,NULL, &n);

する必要があります:

clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, sizeof(size_t), &n, NULL);
于 2013-09-26T09:35:21.520 に答える
0

CL_PROGRAM_BINARY_SIZES および CL_PROGRAM_BINARIES を指定した clGetProgramInfo は、プログラムのビルド時に指定したデバイスごとにバイナリを作成するため、単一の変数だけでなく、配列へのポインターを必要とします。そのため、最初の行は何も返しません。2 番目の例の n は、デバイスの数です。

2 番目の例が実行ごとに異なる理由がわかりません...毎回同じデバイス用にビルドしていますか?

于 2012-10-13T10:18:53.347 に答える