我使用 Eclipse 作为 OpenCL 的编辑器,并为*.cl
文件打开语法高亮显示,使其表现得像 C++ 代码。它工作得很好,但我所有的代码都被强调为语法错误。有没有办法让我的语法突出显示并仅为我的*.cl
文件关闭错误/警告?
2 回答
首先,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,但这将是一项巨大的工作。
除了 ggrussel 的回答之外,我还做了以下步骤,这些步骤给了我可接受的语法突出显示,同时避免了 eclipse 的其他问题(针对 Kepler 测试)。
创建一个包含在所有 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)可能会变得相当冗长,因此如果您使用此类基元,您可能希望使用一些脚本自动预生成这些字段。
在工作区设置(Window>Preferences)中,在 C/C++ > File Types 下添加一个新的文件类型。使用 *.cl 作为模式,使用 C++ Source File 作为类型。
- 从实际构建中排除所有 *.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;
}