【问题标题】:How to turn off errors/warnings in Eclipse due to OpenCL/CUDA syntax?由于 OpenCL/CUDA 语法,如何关闭 Eclipse 中的错误/警告?
【发布时间】:2010-11-03 13:34:45
【问题描述】:

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

【问题讨论】:

    标签: eclipse syntax-highlighting cuda opencl nvidia


    【解决方案1】:

    首先,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,但这将是一项巨大的工作。

    【讨论】:

      【解决方案2】:

      除了 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++ Source File 作为类型。

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

      请注意,在进行这些更改后,您可能需要关闭并重新打开 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;
      }
      

      【讨论】:

      • OpenCL 文件中的包含指令仍然没有得到普遍支持。
      • 我没有意识到这一点,如果您对 opencl 中的 include 指令有问题,我认为最简单的解决方案是将 #ifndef 移到 .CL 文件中。
      • 不支持哪些平台?
      猜你喜欢
      • 2014-01-20
      • 2011-01-27
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多