SEXP getDeviceIDs(SEXP sPlatformID){
    resetError("ROpenCL::getDeviceIDs");
    Rcpp::XPtr<cl_platform_id> platformID(sPlatformID);

    cl_uint num_GPUs = 0;
    logError( clGetDeviceIDs(*platformID, CL_DEVICE_TYPE_GPU, 0, 0, &num_GPUs) );
    std::vector<cl_device_id> gpus(num_GPUs);
    logError( clGetDeviceIDs(*platformID, CL_DEVICE_TYPE_GPU, num_GPUs, gpus.empty() ? NULL : &gpus.front(), &num_GPUs) );

    cl_uint num_nonGPUs = 0;
    logError( clGetDeviceIDs(*platformID, ~CL_DEVICE_TYPE_GPU, 0, 0, &num_nonGPUs) );
    std::vector<cl_device_id> devices(num_nonGPUs);
    logError( clGetDeviceIDs(*platformID, ~CL_DEVICE_TYPE_GPU, num_nonGPUs, devices.empty() ? NULL : &devices.front(), &num_nonGPUs) );

    //for each device in devices add its pointer to the return list
    Rcpp::List result(gpus.size() + devices.size());
    //To be more compatible with the previous version of this function, put GPUs first in the result list.
    for (int i=0; i<gpus.size(); i++){
        cl_device_id *tempDeviceID = new cl_device_id;
        *tempDeviceID = gpus[i];
        Rcpp::XPtr<cl_device_id> tempXPtr(tempDeviceID);
        result[i] = tempXPtr;
    }
    for (int i=0; i<devices.size(); i++){
        cl_device_id *tempDeviceID = new cl_device_id;
        *tempDeviceID = devices[i];
        Rcpp::XPtr<cl_device_id> tempXPtr(tempDeviceID);
        result[i+gpus.size()] = tempXPtr;
    }
    PRINTONERROR();
    return result;
}
Ejemplo n.º 2
0
void Renderer::initDevice() {
    uint32_t gpuCount;
    errorCheck(vkEnumeratePhysicalDevices(mInstance, &gpuCount, nullptr));

    std::vector<VkPhysicalDevice> gpus(gpuCount);
    errorCheck(vkEnumeratePhysicalDevices(mInstance, &gpuCount, gpus.data()));

    printf("GPUS:\n");
    for (auto it = gpus.begin(); it < gpus.end(); it++) {
        checkDeviceProperties(*it);
    }

    mGpu = gpus[0]; // Grabbing the first one (doesn't mean that the first one is the best one)
    vkGetPhysicalDeviceProperties(mGpu, &mGpuProperties);

    uint32_t familyCount;
    vkGetPhysicalDeviceQueueFamilyProperties(mGpu, &familyCount, nullptr);
    std::vector<VkQueueFamilyProperties> familyProperties(familyCount);
    vkGetPhysicalDeviceQueueFamilyProperties(mGpu, &familyCount, familyProperties.data());

    bool found = false;
    for (uint32_t i = 0; i < familyCount; i++) {
        if (familyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
            mGraphicsFamilyIndex = i;
            found = true;
            break;
        }
    }

    if (!found) {
        assert(0 && "Couldn't find a graphics queue");
        std::exit(-1);
    }

    // Vulkan layers enumeration example.
    /*{
        uint32_t layerCount;
        vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
        std::vector<VkLayerProperties> layerProperties(layerCount);
        vkEnumerateInstanceLayerProperties(&layerCount, layerProperties.data());
        printf("Instance layers installed:\n");
        for (auto &i : layerProperties) {
            printf("  %s\t\t\t | %s\n", i.layerName, i.description);
        }
    }
    {
        uint32_t layerCount;
        vkEnumerateDeviceLayerProperties(mGpu, &layerCount, nullptr);
        std::vector<VkLayerProperties> layerProperties(layerCount);
        vkEnumerateDeviceLayerProperties(mGpu, &layerCount, layerProperties.data());
        printf("Device layers installed:\n");
        for (auto &i : layerProperties) {
            printf("  %s\t\t\t | %s\n", i.layerName, i.description);
        }
    }*/

    float queuePriorities[]{ 1.0 };
    VkDeviceQueueCreateInfo deviceQueueCreateInfo{};
    deviceQueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
    deviceQueueCreateInfo.queueFamilyIndex = mGraphicsFamilyIndex;
    deviceQueueCreateInfo.queueCount = 1;
    deviceQueueCreateInfo.pQueuePriorities = queuePriorities;

    VkDeviceCreateInfo deviceCreateInfo{};
    deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
    deviceCreateInfo.queueCreateInfoCount = 1;
    deviceCreateInfo.pQueueCreateInfos = &deviceQueueCreateInfo;
    deviceCreateInfo.enabledLayerCount = mDeviceLayerList.size();
    deviceCreateInfo.ppEnabledLayerNames = mDeviceLayerList.data();
    deviceCreateInfo.enabledExtensionCount = mDeviceExtensionList.size();
    deviceCreateInfo.ppEnabledExtensionNames = mDeviceExtensionList.data();

    errorCheck(vkCreateDevice(mGpu, &deviceCreateInfo, nullptr, &mDevice));
    vkGetDeviceQueue(mDevice, mGraphicsFamilyIndex, 0, &mGraphicsQueue);
}