4

我使用 Eclipse 作为 OpenCL 的编辑器,并为*.cl文件打开语法高亮显示,使其表现得像 C++ 代码。它工作得很好,但我所有的代码都被强调为语法错误。有没有办法让我的语法突出显示并仅为我的*.cl文件关闭错误/警告?

4

2 回答 2

6

首先,Eclipse 语法高亮是针对 C 和 C++ 的语法编写的,而不是 OpenCL,因此它不知道 OpenCL 的语法扩展,例如

  • 新关键字
  • 新数据类型

我建议可以有条件地将新关键字定义为空,例如

#define __kernel 
#define __global

并且可以类似地对待额外的类型名,例如

#define float2 float

#defines 需要加以保护,以免在 OpenCL 代码的编译应用,仅在 Eclipse 编辑器中应用。定义可以在 Eclipse 首选项中设置,也可以在内核代码本身中进行保护。

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

这将有一个小问题,因为它消除了 Eclipse 导航视图中函数重载之间的区别。

理想的答案是重新编程 CDT 编辑器(Eclipse 中解析您键入的文本并对其执行分析的部分)以了解 OpenCL,但这将是一项巨大的工作。

于 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. 在工作区设置(Window>Preferences)中,在 C/C++ > File Types 下添加一个新的文件类型。使用 *.cl 作为模式,使用 C++ Source File 作为类型。

  3. 从实际构建中排除所有 *.cl 文件,右键单击文件 > 属性 > C/C++ 构建 > 设置 > 从构建中排除。

请注意,在进行这些更改后,您可能需要关闭并重新打开 CL 文件,然后编辑器才能正确突出显示它们。

在 OpenCL 下编译并正确突出显示并显示 swizzling 的 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 回答