Как отключить ошибки/предупреждения в Eclipse из-за синтаксиса OpenCL/CUDA?

Я использую Eclipse в качестве редактора для OpenCL и включил подсветку синтаксиса для файлов *.cl, чтобы они вели себя как код C++. Он отлично работает, но весь мой код подчеркнут как синтаксические ошибки. Есть ли способ, которым я могу подсветить синтаксис и отключить ошибки/предупреждения только для моих *.cl файлов?


person smuggledPancakes    schedule 03.11.2010    source источник


Ответы (2)


Во-первых, подсветка синтаксиса Eclipse запрограммирована на грамматику C и C++, а не на OpenCL, поэтому она не знает о синтаксических расширениях OpenCL, таких как

  • Новые ключевые слова
  • Новые типы данных

Я предлагаю, чтобы новые ключевые слова могли быть условно определены ни к чему, например.

#define __kernel 
#define __global

и дополнительные имена типов можно обрабатывать аналогичным образом, например.

#define float2 float

#define необходимо охранять, чтобы не применять при компиляции кода OpenCL, а только в редакторе Eclipse. Определения могут быть установлены в настройках Eclipse или защищены в самом коде ядра.

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

Это будет иметь небольшую проблему, поскольку устраняет различие между перегрузками в функциях в представлениях навигации в Eclipse.

Идеальный ответ — перепрограммировать редактор CDT (часть Eclipse, которая анализирует текст, который вы вводите, и выполняет его анализ), чтобы он знал об OpenCL, но это потребовало бы значительных усилий.

person grrussel    schedule 06.11.2010

В дополнение к ответу ggrussel я сделал следующие шаги, которые дают мне приемлемую подсветку синтаксиса, избегая при этом других проблем с eclipse (проверено для Кеплера).

  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++ Build > Settings > Exclude from build.

Обратите внимание, что после внесения этих изменений вам может потребоваться закрыть и снова открыть файлы CL, прежде чем редактор правильно их выделит.

Пример CL-файла, который компилируется под OpenCL, правильно подсвечивается и показывает качание:

#include "eclipseFakeOpenCL.h"

kernel void nextIntersect() {
  float4 a,b;

  a.xzy = (float3)(1.0, 1.0, 0.0);
  b.xy = a.yx;
}
person mbrx    schedule 08.08.2013
comment
Однако директивы include в файлах OpenCL по-прежнему не поддерживаются повсеместно. - person einpoklum; 19.08.2013
comment
Я не знал об этом, если у вас есть проблемы с директивой include в opencl, я думаю, что самым простым решением было бы просто переместить #ifndef в файл .CL. - person mbrx; 21.08.2013
comment
На каких платформах они не поддерживаются? - person David Sauter; 30.12.2014