2013-01-24 3 views
5

OpenCLカーネルを.clファイルに書きました。いくつかのヘッダーを#includeにしようとします。OpenCL .clファイルへのヘッダーが含まれています

含まれているヘッダーファイルが「見つからない」ため、コンパイルに失敗します。 私はclBuildProgramがヘッダファイルを検索するディレクトリのリストにディレクトリを追加しますdir-I dirオプションを取ることができることを承知しています。 khronusサイトのフォーラムの問題については、この記事http://www.khronos.org/message_boards/viewtopic.php?f=37&t=2535会談で

彼らは(.hファイルを含む)すべてのソースを指定するclCreateProgramWithSourceを使用することを提案します。

  1. 良いオプションです:

    私は、この問題に関する質問がありますか? (clBuildProgramclCreateProgramWithSource、上記のように)
  2. 私はclCreateProgramWithSourceを使用している場合はどのようにコンパイラが含まれるように知っているのでしょうか?つまり、どのソースがファイル名を含むのかを表していますか?
  3. clBuildProgramを使用し、インクルードファイルを含む複数のディレクトリがある場合、どのように指定するのですか?

答えて

5

のOpenCLあなたはclBuildProgram()続いclCreateProgramWithSource()を使用する必要があり。

ClCreateProgramWithSource()を作成しcl_programオブジェクトを返します。 cl_programオブジェクトがclBuildProgram()に入力されていることを

clBuildProgram()では、インクルードファイル ディレクトリを含むコンパイラオプションを指定できます。使用しているコンパイラは、使用しているのOpenCL SDK内部のOpenCLコンパイラある

-I myincludedir1 -I myincludedir2 ... 

:あなたのケースでは、ヘッダファイルのために、それは文字列のようなものになります、含まれています。したがって、 がAMDのSDKを使用している場合は、OpenCL SDKの一部であるAMD OpenCLコンパイラが使用されます。同様にの場合NvidiaまたはIntelの場合。

すべてのOpenCLステータスコードを確認することが重要です。OpenCL関数呼び出しです。 clCreateProgramWithSource()およびclBuildProrgam()は、コンパイラのエラーまたはメッセージである を取得するために必須です。 と書くと、メッセージのサイズを取得してからメッセージ自体を取得するためのビットコード全体があります。

2

-Iを特定の数のインクルードとコード長で使用すると、Nvidia OpenCLデバイスドライバにバグが発生します。 AMDとIntelにはこの問題はありません。私の解決策は、実行時にすべての.clファイルを1つの大きなファイルに連結することです。これの欠点は、コードのデバッグでエラーの行番号が連結された.clファイルに対応し、個々の.clファイルには対応しないことです。

Nvidiaがこれを修正するかどうかは疑問です。彼らはもはやOpenCLを気にしません。

+0

AMD APPは、-Iで問題あまりにも私の経験から(それは単に動作しません)があります。 – Thomas

+0

それは面白いです。私はCPU上でそれをテストしましたが。私はAMD GPUを持っていないので、GPUでテストすることはできません。多分それはGPU対CPUの問題ですか? –

+0

いいえ、Windows下で両方のデバイスの下で試しましたが、コンパイラは単に相対インクルードパスを処理していないようです。基本的に私のコンパイラのコマンドラインには "-I cl /"があり、私のカーネルはcl /ディレクトリにうまく配置されていますが、Intel/Linuxではうまく動作しますが、AMDはまったく問題がありません私が試したこと、そして私が見つけた唯一の解決策は、#includeディレクティブで各.clファイルの*絶対パス*をハードコーディングするか、システム$ PATHにcl /フォルダを追加することでした。それは私のインストールは、壊れているかもしれませんが、私は私のLinuxシステムと同じくらい私のWindowsシステムを維持しません。 – Thomas

0

汚れたトリックが1つあります:あなた自身を含めてエミュレートする必要があります(つまり、マニュアルアマルガメーションのようなもの)。コーディングはそれほど明確ではありませんが、OpenCLコンパイラが-Iディレクティブをサポートしていない(または間違ってサポートしていない)場合に機能します。このアプローチは完全ではありません(たとえば、構文のハイライトを失うなど)が、古いまたはバグの多いOpenCLコンパイラに役立ちます。この可能性の

小単純な例:インテルは完全にそれを扱うのに

std::string load_file(const std::string &file_name, int max_size = 0x100000) 
{ 
    FILE *fp = fopen(file_name.c_str(), "rb"); 
    if (!fp) 
    { 
     // print some error or throw exception here 
     return std::string(); 
    } 
    char *source = new char[max_size]; 
    size_t source_size = fread(source, 1, max_size, fp); 
    fclose(fp); 
    if (!source_size) 
    { 
     delete[] source; 
     // print some error or throw exception here 
     return std::string(); 
    } 
    std::string result(source); 
    delete[] source; 
    return result; 
} 

// errors checks are omitted for simplification 
std::string full_source = load_file("header.h"); 
full_source += load_file("source.cl"); 

const char *source_ptr = full_source.c_str(); 
size_t source_size = full_source.size(); 
cl_int_status = CL_SUCCESS; 
cl_program program = clCreateProgramWithSource(context, 1, 
     (const char **)&source_ptr, (const size_t *)&source_size, &ret); 
// check status for CL_SUCCESS here 
// now you have your program (include + source) 
関連する問題