Включение заголовка OpenCL с проблемой относительного пути в C ++ - PullRequest
6 голосов
/ 09 ноября 2011

Я пытаюсь запустить пример OpenCL C ++ на Eclipse CTD, который (на Mac) включает в себя заголовок OpenCL следующим образом:

#include <OpenCL/cl.h>

Файл существует в моей системе (OpenCL SDK по умолчанию установлен наMac), но не в каталоге OpenCL (фактический путь: /System/Library/Frameworks/OpenCL.framework/Versions/A/Headers), поэтому, если я добавлю этот путь в качестве включенного каталога в свойствах проекта и удалю относительный каталог OpenCL из оператора #include, связь, очевидно, будет решена но Я заметил, что в этом файле cl.h другие файлы заголовков ссылаются по тому же относительному пути (например, OpenCL/cl_platform.h), но вы можете видеть из пути выше этого * 1011Каталог * OpenCL на самом деле не существует, поэтому мне интересно, как эта штука должна работать вообще.

Мой вопрос:

В моем примере выше, - этокаталог 'OpenCL' в относительном пути должен где-то существовать физически или должен быть какой-то переменной окружения или аналогом, который указывает на фактический путь SDKустановлен в ?

Извините за путаницу, любая помощь приветствуется!

Примечание: из этой статьи на сайте khronos кажется, что каталог OpenCLдолжен существовать физически.

Ответы [ 2 ]

8 голосов
/ 09 ноября 2011

Я рекомендую вам прочитать документацию Apple по Frameworks .

Основная история, однако, заключается в том, что OS X разрешает пути поиска в библиотеках и заголовках на основе компилируемых сред. Например, чтобы скомпилировать программу с использованием OpenCL SDK на Macintosh, вы должны скомпилировать ее следующим образом:

clang -framework OpenCL main.c

Это говорит clang (или gcc, или llvm-gcc, в зависимости от вашего выбора компилятора) искать в System OpenCL SDK как заголовки (для компиляции), так и библиотеки (для компоновки). Попробуйте:

// compile me with: clang -framework OpenCL -o test test.c

#include <stdio.h>
#include <stdlib.h>
#include <OpenCL/opencl.h>

int main(int argc, char* const argv[]) {
    cl_uint num_devices, i;
    clGetDeviceIDs(NULL, CL_DEVICE_TYPE_ALL, 0, NULL, &num_devices);

    cl_device_id* devices = calloc(sizeof(cl_device_id), num_devices);
    clGetDeviceIDs(NULL, CL_DEVICE_TYPE_ALL, num_devices, devices, NULL);

    char buf[128];
    for (i = 0; i < num_devices; i++) {
        clGetDeviceInfo(devices[i], CL_DEVICE_NAME, 128, buf, NULL);
        fprintf(stdout, "Device %s supports ", buf);

        clGetDeviceInfo(devices[i], CL_DEVICE_VERSION, 128, buf, NULL);
        fprintf(stdout, "%s\n", buf);
    }

    free(devices);
}

Обратите внимание, что я включил сюда OpenCL/opencl.h. Это предпочтительный заголовок для включения доступа к CL на Mac. Если вы посмотрите на заголовок, вы увидите, что он включает в себя cl.h для вас, а также cl_platform.h. Вы можете просто включить OpenCL/cl.h, если хотите; все равно будет работать нормально.

2 голосов
/ 09 ноября 2011

В соответствии со спецификациями Khronos ссылка на K есть отдельный файл, который действует как оболочка для C ++, также «.h» в конце файла означает, что, вероятно, этот заголовок предназначен только дляC и «возможно» для C ++.Возможно, вы сможете решить эту задачу, прочитав эту страницу.

В любом случае я обнаружил, что Eclipse CDT действительно глючит, и, возможно, стоит попытаться скомпилировать его из командной строки, потому что среде MAC OS действительно не хватает хорошей IDE и, вообще говоря, это не так.хорошая ОС для разработчиков.

Имейте в виду, что единственным "родным" языком для MAC является Objective-C, а все остальные, если они есть, переносятся;если вы планируете разрабатывать некоторые важные проекты, я бы предложил рассмотреть возможность перехода на Windows или Linux, потому что даже Linux предлагает лучшую среду для разработчиков по сравнению с MAC OSX.

Edit 1: вот пример, который я нашел, он использует привязку, описанную на странице Khronos, которую я только что связал ссылка 2 пример

Редактировать 2: вы можете попробовать 2 вещи - переустановить драйверы VGA, которые обычно содержат надлежащий OpenCLSDK для вашей машины (Intel также предлагает SDK, но он работает только на процессоре iCore и некоторых C2D) - для компиляции из командной строки

Но на этом этапе вашими лучшими компаньонами могут быть Xcode и онлайн-документация для OpenCLв MAC ссылка (обратите внимание, что по умолчанию в MAC включена версия библиотеки OpenCL 1.0) просто потому, что Xcode предлагает лучшую поддержку для такого рода проектов в MAC, и вы можете найти множество учебных пособий в Интернете, используя этоIDE.

...