Opencl 设备裂变英特尔CPU

Opencl 设备裂变英特尔CPU,opencl,Opencl,我正试图用设备裂变扩展写一个opencl程序 我使用的是Intel i3 M350,但无法创建子设备: #define USE_CL_DEVICE_FISSION 1 #include <iostream> #include "CL/cl.hpp" using namespace std; int main(int argc, char* argv[]) { cl::Context context; std::vector<cl::Platform>

我正试图用设备裂变扩展写一个opencl程序

我使用的是Intel i3 M350,但无法创建子设备:

#define USE_CL_DEVICE_FISSION 1

#include <iostream>
#include "CL/cl.hpp"

using namespace std;

int main(int argc, char* argv[]) {
    cl::Context context;
    std::vector<cl::Platform> platforms;
    cl::Platform::get(&platforms);

    cl_context_properties properties[] =
    {
            CL_CONTEXT_PLATFORM,
            (cl_context_properties)(platforms[1])(),
            0
    };

    context = cl::Context(CL_DEVICE_TYPE_CPU, properties);

    std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();

    cout << "Platform:\t" << platforms[1].getInfo<CL_PLATFORM_NAME>() << endl;
    cout << "Version:\t" << platforms[1].getInfo<CL_PLATFORM_VERSION>() << endl;

    cout << "Device:\t\t" << devices[0].getInfo<CL_DEVICE_NAME>() << endl;
    cout << "Profile:\t" << devices[0].getInfo<CL_DEVICE_PROFILE>() << endl;
    cout << "Driver:\t\t" << devices[0].getInfo<CL_DRIVER_VERSION>() << endl;
    cout << "ComputeUnits:\t" << devices[0].getInfo<CL_DEVICE_MAX_COMPUTE_UNITS >() << endl;

    if (devices[0].getInfo<CL_DEVICE_EXTENSIONS>().find("cl_ext_device_fission") == std::string::npos) {
        cout << "No device fission support!" << endl;
        exit(-1);
    }
    else {
        cout << "Device Fission: Available" << endl;
    }

    const cl_device_partition_property_ext subDeviceProperties[] =
    {
        CL_DEVICE_PARTITION_EQUALLY_EXT,
        1,
        CL_PROPERTIES_LIST_END_EXT,
        0
    };

    std::vector<cl::Device> subDevices;
    int err = devices[0].createSubDevices(subDeviceProperties, &subDevices);
    if (err != CL_SUCCESS) {
        cout << "\nError: " << err << endl;
    }
}
此错误代码表示:

CL_设备_分区_故障_分机-1057

Returned by clCreateSubDevicesEXT when the total number of compute units
requested exceeds CL_DEVICE_MAX_COMPUTE_UNITS, or the number of compute
units for any one sub-device is less than 1.

有什么想法吗?

你有没有试过

比如:

示例:要将四个计算单元设备拆分为两个子设备, 每个包含两个计算单元,通过:

            { CL_DEVICE_PARTITION_BY_COUNTS_EXT, 
              2, 2, CL_PARTITION_BY_COUNTS_LIST_END_EXT,
              CL_PROPERTIES_LIST_END_EXT }

您是否尝试过任何来自

比如:

示例:要将四个计算单元设备拆分为两个子设备, 每个包含两个计算单元,通过:

            { CL_DEVICE_PARTITION_BY_COUNTS_EXT, 
              2, 2, CL_PARTITION_BY_COUNTS_LIST_END_EXT,
              CL_PROPERTIES_LIST_END_EXT }

首先,询问有关英特尔OpenCL SDK实施的问题的最佳场所是他们(我们)的论坛:

也就是说,当前版本在CLCreateSubDeviceText的实现方面有一些怪癖。您似乎遇到的一个问题是,它希望C API中的最后一个参数num_devices_ret是一个非空指针,指向生成的子设备的数量。C++包装显然不熟悉这个问题,因此得到了失败的返回值。 <>我不太熟悉C++包装器,所以我不知道它是否能强制它在CelCurtSubDeVICEXEXT的底层调用中传递非空指针。假设您不能,潜在的解决方案是自己修改包装器,或者使用C API


SDK的未来版本将对这些事情不那么挑剔;在您拥有的其中一个应用程序中,它更像是一个预览功能。

首先,询问有关英特尔OpenCL SDK实现的问题的最佳场所是他们(我们)的论坛:

也就是说,当前版本在CLCreateSubDeviceText的实现方面有一些怪癖。您似乎遇到的一个问题是,它希望C API中的最后一个参数num_devices_ret是一个非空指针,指向生成的子设备的数量。C++包装显然不熟悉这个问题,因此得到了失败的返回值。 <>我不太熟悉C++包装器,所以我不知道它是否能强制它在CelCurtSubDeVICEXEXT的底层调用中传递非空指针。假设您不能,潜在的解决方案是自己修改包装器,或者使用C API


SDK的未来版本将对这些事情不那么挑剔;在您拥有的一款中,它更多的是一种预览功能。

谢谢,该链接很有用。然而,我也尝试了上面的分区。可能是硬件相关的吗?谢谢,链接很有用。然而,我也尝试了上面的分区。它可能与硬件有关吗?你是对的,因为它是特定于英特尔的,它属于那里。我也把它贴在那边了。对于以下线程:我使用C对其进行测试,但不断得到
[appname]:符号查找错误:[appname]:未定义的符号:CLCreateSubDeviceText
。您是对的,因为它是特定于英特尔的,所以它属于那里。我也把它贴在那边了。对于以下线程:我使用C来测试它,但不断得到
[appname]:符号查找错误:[appname]:未定义的符号:CLCreateSubDeviceText