我想在用C ++编写的FastCGI应用程序中使用OpenCL。但是,在使用OpenCL框架后,FCGX_Accept_r方法返回错误(-9)。我没有得到任何异常或其他错误,第一个请求被完全处理并返回一个有效的响应,但接受循环中断。我把它煮成了这个最小的例子:
#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,带有mod_proxy_fcgi的Apache webserver,g ++ v 5.4.0,来自Ubuntu存储库和Intel OpenCL环境的fcgi库。
你知道为什么事件循环中断或我如何调试它?它可能是OpenCL实现中的错误还是libfcgi?
提前感谢您的帮助!
更新:我发现使用strace,OpenCL关闭了filedescriptor 0(stdin)。这就是FCGI之后停止工作的原因,它也解释了为什么只输出平台的简单程序会返回而没有错误。作为一种解决方法,我使用dup()函数来保存stdin文件描述符和dup2(),以便在使用OpenCL后将其恢复。