2012-02-27 27 views
14

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); 
+0

カーネルソースをある種のサードパーティツールに貼り付けましたか?プロファイラーかもしれない?ビルドエラーが発生すると、通常はプログラム自体の構文になります。 – mfa

答えて

30

このエラーは、通常、カーネルコードの構文エラーが原因で発生します。コンパイラによって生成されたログにアクセスするには、OpenCL関数clGetProgramBuildInfoをフラグCL_PROGRAM_BUILD_LOGと呼ぶことができます。このログには、コマンドラインでコンパイルする際におそらく使用していた出力(エラー、警告など)が含まれています。あなたがclBuildProgramを呼び出した後

たとえば、次のようなものを追加することができます。

if (err == CL_BUILD_PROGRAM_FAILURE) { 
    // Determine the size of the log 
    size_t log_size; 
    clGetProgramBuildInfo(program, devices_id[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size); 

    // Allocate memory for the log 
    char *log = (char *) malloc(log_size); 

    // Get the log 
    clGetProgramBuildInfo(program, devices_id[0], CL_PROGRAM_BUILD_LOG, log_size, log, NULL); 

    // Print the log 
    printf("%s\n", log); 
} 

あなたは、実例えばAMD APP SDKでSDKCommon.cppの関数buildOpenCLProgram()を参照することができます。

+0

上記のようにbuild_log情報を出力するのと同じことをしました。しかし、それは何かを印刷しています。私はmalloc()を使ってbuild_log用のストレージを作成しました。 – Gopal

+0

私はあなたが "**何も印刷していない**"ということを推測していますか? printfが実際に呼び出されていることを確認できますか?文字列がヌルで終了するように、ログを最初に初期化する必要があります。 "memset(log、0、log_size);"を追加してみてください。 mallocの呼び出しの後に。 –

+0

私は "memset((void *)build_log、0、sizeof(build_log));"しかし、この行ではセグメンテーションフォールトが発生しています... – Gopal

関連する問題