FastCGI FCGX_Accept_r не принимает запрос на принятие при доступе к платформам OpenCL

Я хочу использовать OpenCL в моем приложении FastCGI, написанном на C ++. Однако метод FCGX_Accept_r возвращает ошибку (-9) после того, как я использую платформу OpenCL. Я не получаю никаких исключений или других ошибок, первый запрос полностью обрабатывается и возвращает действительный ответ, но затем разрывается цикл приема. Я сварил это сделано к этому минимальному примеру:

#include <iostream>
#include "fcgio.h"#include <CL/cl.hpp>
#include <vector>

using namespace std;

int main(void) {
// Backup the stdio streambufs
streambuf * cin_streambuf  = cin.rdbuf();
streambuf * cout_streambuf = cout.rdbuf();
streambuf * cerr_streambuf = cerr.rdbuf();

FCGX_Request request;

FCGX_Init();
FCGX_InitRequest(&request, 0, 0);

while (FCGX_Accept_r(&request) == 0) {
fcgi_streambuf cin_fcgi_streambuf(request.in);
fcgi_streambuf cout_fcgi_streambuf(request.out);
fcgi_streambuf cerr_fcgi_streambuf(request.err);

cin.rdbuf(&cin_fcgi_streambuf);
cout.rdbuf(&cout_fcgi_streambuf);
cerr.rdbuf(&cerr_fcgi_streambuf);

// Access OpenCL
std::vector<cl::Platform> platformList;
cl::Platform::get(&platformList);

cout << "Content-type: text/html\r\n\r\n";
for(size_t i = 0; i < platformList.size(); ++i) {
std::string platformName;
platformList[i].getInfo((cl_platform_info)CL_PLATFORM_NAME, &platformName);
cout << platformName << "\n";
}

// Note: the fcgi_streambuf destructor will auto flush
}

// restore stdio streambufs
cin.rdbuf(cin_streambuf);
cout.rdbuf(cout_streambuf);
cerr.rdbuf(cerr_streambuf);

return 0;
}

Это может быть скомпилировано с помощью

g++ main.cpp -lfcgi++ -lfcgi -lOpenCL

И процесс fastcgi порожден

spawn-fcgi -p 1337 a.out

По первому запросу возвращается «Intel (R) OpenCL», после чего сервис недоступен.

Мои настройки: Ubuntu 16.04 LTS, веб-сервер Apache с mod_proxy_fcgi, g ++ v 5.4.0, библиотеки fcgi из репозитория Ubuntu и среда Intel OpenCL.

У вас есть идеи, почему прерывается цикл обработки событий или как я могу это отладить? Может ли это быть ошибкой в ​​реализации OpenCL или libfcgi?

Заранее благодарю за любую помощь!

Обновить: С помощью strace я обнаружил, что OpenCL закрывает файловый дескриптор 0 (stdin). Вот почему FCGI перестает работать после этого, а также объясняет, почему простая программа, выводящая только платформы, возвращается без ошибок. В качестве обходного пути я использую функцию dup () для сохранения файлового дескриптора stdin и dup2 () для его возврата после использования OpenCL.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]