【发布时间】:2010-11-03 13:34:45
【问题描述】:
我使用 Eclipse 作为 OpenCL 的编辑器,并为 *.cl 文件启用了语法高亮显示,使其表现得像 C++ 代码。它工作得很好,但我所有的代码都被强调为语法错误。有没有办法让我的语法突出显示并仅为我的 *.cl 文件关闭错误/警告?
【问题讨论】:
标签: eclipse syntax-highlighting cuda opencl nvidia
我使用 Eclipse 作为 OpenCL 的编辑器,并为 *.cl 文件启用了语法高亮显示,使其表现得像 C++ 代码。它工作得很好,但我所有的代码都被强调为语法错误。有没有办法让我的语法突出显示并仅为我的 *.cl 文件关闭错误/警告?
【问题讨论】:
标签: eclipse syntax-highlighting cuda opencl nvidia
首先,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)可能会变得相当冗长,因此如果您使用此类基元,您可能希望使用一些脚本自动预生成这些字段。
在工作区设置(窗口>首选项)中,在 C/C++ > 文件类型下添加一个新文件类型。使用 *.cl 作为模式,使用 C++ Source File 作为类型。
请注意,在进行这些更改后,您可能需要关闭并重新打开 CL 文件,然后编辑器才能正确突出显示它们。
在 OpenCL 下编译的 CL 文件示例,该文件正确突出显示并显示 swizzling:
#include "eclipseFakeOpenCL.h"
kernel void nextIntersect() {
float4 a,b;
a.xzy = (float3)(1.0, 1.0, 0.0);
b.xy = a.yx;
}
【讨论】: