如何在C ++ UWP应用程序中使用Tensorflow GPU?

时间:2019-01-15 19:38:58

标签: c++ tensorflow uwp


我正在尝试在C ++ UWP应用程序中运行tensorflow-gpu,但不幸的是,它仅使用CPU。

我的设置如下:
操作系统平台:Windows 10
TensorFlow版本:1.12.0
CUDA / cuDNN版本:我有两种配置(CUDA 10.0为CUDA 10.0 / cuDNN 7.3)和CUDA 9.0为(CUDA 9.0.17和cuDNN 7.3)两种配置
GPU型号和内存:Nvidia GTX1060
环境:Visual Studio 2017 15.9

我从各种来源安装了tensorflow:
https://github.com/Neargye/tensorflow/releases
https://github.com/fo40225/tensorflow-windows-wheel
https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-gpu-windows-x86_64-1.12.0.zip
并且还使用anaconda下载了python的tensorflow-gpu(然后python脚本中的tensorflow使用了GPU)。

我将所有lib / dll文件复制到输出目录,设置了链接器配置(我还添加了所有可能的CUDA / cuDNN文件,并测试了这些文件的组合),但是没有任何效果。

我使用以下代码测试tensorflow是否看到GPU:

std::string getGPUDeviceName(TF_Session* session) 
{
    std::unique_ptr<TF_Status, decltype(&TF_DeleteStatus)> status(
        TF_NewStatus(), TF_DeleteStatus);

    std::unique_ptr<TF_DeviceList, decltype(&TF_DeleteDeviceList)> list(
        TF_SessionListDevices(session, status.get()), TF_DeleteDeviceList);
    auto device_list = list.get();

    auto num_devices = TF_DeviceListCount(device_list);
    for (auto i = 0; i < num_devices; ++i) {
        auto device_name = TF_DeviceListName(device_list, i, status.get());
        auto device_type = TF_DeviceListType(device_list, i, status.get());

        if (device_type == DEVICE_GPU)
        {
            return device_name;
        }
    }
    // No GPU device found.
    return "";
}

std::string getGPUDeviceName() 
{
    std::unique_ptr<TF_Status, decltype(&TF_DeleteStatus)> status(TF_NewStatus(), TF_DeleteStatus);
    std::unique_ptr<TF_Graph, decltype(&TF_DeleteGraph)> graph(TF_NewGraph(),
                                                                TF_DeleteGraph);

    std::unique_ptr<TF_SessionOptions, decltype(&TF_DeleteSessionOptions)> opts (TF_NewSessionOptions(), 
                                                                                    TF_DeleteSessionOptions);
    std::unique_ptr < TF_Session, std::function<void(TF_Session*)>> sess(
        TF_NewSession(graph.get(), opts.get(), status.get()),
        [statusPtr = status.get()](auto sess) {TF_DeleteSession(sess, statusPtr); });

    return getGPUDeviceName(sess.get());
}

我没有任何想法,在这个话题上我还能做些什么。

0 个答案:

没有答案