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

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

Ответы [ 2 ]

6 голосов
/ 07 ноября 2010

Во-первых, подсветка синтаксиса 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, но это будет существенным усилием.

1 голос
/ 08 августа 2013

В дополнение к ответу ggrussel я сделал следующие шаги, которые дают мне приемлемую подсветку синтаксиса, избегая других проблем с затмением (проверено на 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, прежде чем редактор правильно выделит их.

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

#include "eclipseFakeOpenCL.h"

kernel void nextIntersect() {
  float4 a,b;

  a.xzy = (float3)(1.0, 1.0, 0.0);
  b.xy = a.yx;
}
...