OpenCL 拡張アプリケーションを構築しています。私が最初に ViennaCL を使用していたとき、内部カーネルをコンパイルしているときに、最終的に次のようになることがわかりました。
Stack dump:
0.      <eof> parser at end of file
私はすぐに、ViennaCL の失敗を非難したので、いくつかの OpenCL ヘルパー関数をすぐにまとめて、非常に単純なベクトル加算カーネルをコンパイルしようとしました。
プログラムが行う手順は次のとおりです。
- プラットフォームを作成する
- デバイスを選択
- コンテキストを作成する
- キューを作成する
- 一部のデータをデバイスにプッシュする
- カーネルをコンパイルする
- カーネルをキューに入れる
- カーネルが終了するのを待ちます
- データを読み返す
そのほとんどをコメントアウトした後、必須のセットアップとカーネルをコンパイルするコマンドが残っています。ただし、結果は同じです。
Stack dump:
0.      <eof> parser at end of file
これは問題のある機能です:
void createProgram(std::string progstr)
{
    const char ** conv = new const char*[1];
    conv[0] = progstr.c_str();
    cl_int error = 0;
    program = clCreateProgramWithSource(context, 1, conv, NULL, &error);
    if (error != CL_SUCCESS) {
        cout << "Error creating command queue: " << oclErrorString(error) << endl;
        exit(error);
    }
    error = clBuildProgram(program, 1, &device, NULL, NULL, NULL);
    if (error != CL_SUCCESS) {
        cout << "Error creating command queue: " << oclErrorString(error) << endl;
        exit(error);
    }
    char* build_log;
    size_t log_size;
    clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
    build_log = new char[log_size+1];
    clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, log_size, build_log, NULL);
    build_log[log_size] = '\0';
    cout << build_log << endl;
    delete[] build_log;
}
contextとdeviceが定義され、有効programですcl_program。
私は現在、株式ベクトル追加カーネルでテストしています:
__kernel void vector_add_gpu (__global const float* src_a, __global const float* src_b, __global float* res, const int num)
{
    const int idx = get_global_id(0);
    if (idx < num)
       res[idx] = src_a[idx] + src_b[idx];
}
別の OpenCL 対応デバイスにアクセスして、これが間違っている可能性があるかどうかを確認することはできません。
私は今、完全に途方に暮れています。AMDフォーラムで、これが悪いドライバーによって引き起こされている可能性があることを示唆する単一のスレッドをグーグルで検索しましたが、セカンドオピニオンが欲しい.