访问OpenCL平台时,FastCGI FCGX_Accept_r接受请求失败

时间:2017-03-10 15:31:05

标签: c++ apache opencl fastcgi mod-proxy

我想在用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后将其恢复。

0 个答案:

没有答案