LinuxでATI RV770グラフィックカード、OpenCl 1.0およびati-stream-sdk-v2.3-lnx64を使用しています。エラーコード(-11):: OpenCLで "cl_build_program_failure"エラーが発生する可能性はありますか?
カーネルプログラムをビルドするために次の2つのセクションを含むホストコードを実行しているときに、エラーコード(-11)、つまりcl_build_program_failure
が表示されています。それはカーネルプログラムがコンパイルされたことを意味しますか?そうでない場合は、どのようにコンパイルされ、デバッグされますか?
const char* KernelPath = "abc_kernel.cl"; //kernel program is in separate file but in same directory of host code..
/*カーネルソースからプログラムオブジェクトを作成します* ** * ** */
char* sProgramSource = readKernelSource(KernelPath);
size_t sourceSize = strlen(sProgramSource) ;
program = clCreateProgramWithSource(context, 1,(const char **) &sProgramSource,&sourceSize, &err);
checkStatus("error while creating program",err);
/*ビルド(コンパイル次のようにカーネルプログラムを読み込むためのリンク)プログラム* * ** ***/
char* options = (char*)malloc(10*sizeof(char));
strcpy(options, "-g");
err = clBuildProgram(program, num_devices, devices_id, options, NULL, NULL);
checkStatus("Build Program Failed", err); //This line throwing the error....
機能がある::
/*読み出されたプログラムのソースファイル*/
char* readKernelSource(const char* kernelSourcePath){
FILE *fp = NULL;
size_t sourceLength;
char *sourceString ;
fp = fopen(kernelSourcePath , "r");
if(fp == 0)
{
printf("failed to open file");
return NULL;
}
// get the length of the source code
fseek(fp, 0, SEEK_END);
sourceLength = ftell(fp);
rewind(fp);
// allocate a buffer for the source code string and read it in
sourceString = (char *)malloc(sourceLength + 1);
if(fread(sourceString, 1, sourceLength, fp) !=sourceLength)
{
printf("\n\t Error : Fail to read file ");
return 0;
}
sourceString[sourceLength+1]='\0';
fclose(fp);
return sourceString;
} //読み込み終了カーネルソース
誰もそれを修正する方法を教えてもらえますか?
実行時に何かOpenClのコンパイルエラーであることを意味しますか?
//以下のようにclGetProgramBuildInfo()を使用してbuild_log情報を印刷しますが、何も印刷されないのはなぜですか?
char * build_log; size_t log_size;
// First call to know the proper size
err = clGetProgramBuildInfo(program, devices_id, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
build_log = (char*)malloc((log_size+1));
// Second call to get the log
err = clGetProgramBuildInfo(program, devices_id, CL_PROGRAM_BUILD_LOG, log_size, build_log, NULL);
build_log[log_size] = '\0';
printf("--- Build log ---\n ");
fprintf(stderr, "%s\n", build_log);
free(build_log);
カーネルソースをある種のサードパーティツールに貼り付けましたか?プロファイラーかもしれない?ビルドエラーが発生すると、通常はプログラム自体の構文になります。 – mfa