4

*.clOpenCLのエディターとしてEclipseを使用しており、ファイルがC++コードのように動作するように構文の強調表示をオンにしました。それはうまく機能しますが、私のコードはすべて構文エラーとして下線が引かれています。構文を強調表示して、ファイルに対してのみエラー/警告をオフにする方法はあり*.clますか?

4

2 に答える 2

6

まず、Eclipse 構文ハイライターは OpenCL ではなく C および C++ の文法に合わせてプログラムされているため、次のような OpenCL の構文拡張を認識しません。

  • 新しいキーワード
  • 新しいデータ型

新しいキーワードは、条件付きで何も定義できないことをお勧めします。

#define __kernel 
#define __global

追加の型名も同様に扱うことができます。

#define float2 float

#definesは、Eclipse エディターでのみ、OpenCL コードのコンパイルに適用されないように保護する必要があります。定義は、Eclipse 設定で設定するか、カーネル コード自体で保護することができます。

#ifndef __OPENCL_VERSION__
/* Define out keywords causing errors */ 
#endif

これには、Eclipse のナビゲーション ビューの関数のオーバーロード間の区別がなくなるという点で、わずかな問題があります。

理想的な答えは、OpenCL を認識できるように CDT エディター (入力したテキストを解析し、その分析を実行する Eclipse の一部) を再プログラムすることですが、それにはかなりの労力がかかります。

于 2010-11-06T22:11:22.260 に答える
1

ggrussel による回答に加えて、Eclipse に関する他の問題を回避しながら、受け入れ可能な構文の強調表示を提供する次の手順を実行しました (Kepler でテスト済み)。

  1. すべての CL ファイルに含まれるヘッダー ファイルを作成します。ヘッダー ファイルには、組み込みデータ型のキーワードと偽の構造の定義が保護されている必要があります。

    #ifndef __OPENCL_VERSION__
    
    #define kernel
    #define global
    #define constant
    #define local
    
    typedef struct float2 {
      float x, y;
    } float2;
    typedef struct float3 {
      float x, y, z;
      float2 xy, xz, yx, yz, zx, zy;
    } float3;
    typedef struct float4 {
      float x, y, z, w;
      float2 xy, yx;
      float3 xyz, xzy, yxz, yzx, zxy, zyx;
    } float4;
    ... etc
    
    #endif
    

    プリミティブ データ型へのアクセスのすべての可能な組み合わせを、独自のフィールドがあるかのように定義する必要があることに注意してください。これは vec8 などの大きなプリミティブでは非常に長くなる可能性があるため、そのようなプリミティブを使用する場合は、スクリプトを使用してこれらのフィールドを自動的に事前生成することをお勧めします。

  2. ワークスペース設定 ([ウィンドウ] > [設定]) で、[C/C++] > [ファイル タイプ] の下に新しいファイル タイプを追加します。*.cl をパターンとして使用し、C++ソースファイルをタイプとして使用します。

  3. すべての *.cl ファイルを実際のビルドから除外し、ファイルを右クリックして [プロパティ] > [C/C++ ビルド] > [設定] > [ビルドから除外] を選択します。

これらの変更を行った後、エディターが正しく強調表示する前に、CL ファイルを閉じて再度開く必要がある場合があることに注意してください。

OpenCL でコンパイルされ、正しく強調表示され、スウィズリングが表示される CL ファイルの例:

#include "eclipseFakeOpenCL.h"

kernel void nextIntersect() {
  float4 a,b;

  a.xzy = (float3)(1.0, 1.0, 0.0);
  b.xy = a.yx;
}
于 2013-08-08T11:55:35.020 に答える