Я хочу использовать 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.
Задача ещё не решена.
Других решений пока нет …