プログラムをファイルにキャッシュして、アセンブリにコンパイルする必要がないようにしようとしています。その結果、私はバイナリをダンプしようとしています。交互に返されるバイナリプログラムの最後にガベージデータがあるという問題が発生しています。
わかりやすくするためにエラーチェックは省略されています(ただし、エラーは発生しません)。
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]の割り当てはループで失敗します)。考え?