【问题标题】:Restrict number of GPUs for AMD OpenCL限制 AMD OpenCL 的 GPU 数量
【发布时间】:2013-01-17 14:11:09
【问题描述】:

是否有限制 AMD OpenCL 平台使用的 GPU 数量的解决方案?对于 NVIDIA 平台,可以简单地设置环境变量 CUDA_VISIBLE_DEVICES 来限制 OpenCL 可用的 GPU 集。

编辑:我知道,我可以用一组减少的设备创建一个上下文。但是,我正在寻找从“外部”控制 OpenCL 平台的设备数量的方法。

【问题讨论】:

    标签: opencl


    【解决方案1】:

    AMD 具有适用于 Windows 和 Linux 的 GPU_DEVICE_ORDINAL 环境变量。这允许您指定希望在 OpenCL 应用程序中可见的 GPU 的索引。例如:

    jprice@nowai:~/benchmark$ python benchmark.py -clinfo
    
    Platform 0: AMD Accelerated Parallel Processing
     -> Device 0: Tahiti
     -> Device 1: Tahiti
     -> Device 2: Intel(R) Core(TM) i5-3550 CPU @ 3.30GHz
    
    jprice@nowai:~/benchmark$ export GPU_DEVICE_ORDINAL=0
    jprice@nowai:~/benchmark$ python benchmark.py -clinfo
    
    Platform 0: AMD Accelerated Parallel Processing
     -> Device 0: Tahiti
     -> Device 1: Intel(R) Core(TM) i5-3550 CPU @ 3.30GHz
    

    更详细的描述可以在 AMD APP OpenCL 编程指南中找到(目前在第 2.4.3 节“屏蔽可见设备”中): http://developer.amd.com/wordpress/media/2013/07/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide-rev-2.7.pdf

    【讨论】:

      【解决方案2】:

      OpenCL 主机 API 允许您在获取设备 ID 列表时指定设备数量

      _int clGetDeviceIDs(    
          cl_platform_id platform,
          cl_device_type device_type,
          cl_uint num_entries,  //  Controls the minimum  number of devices
          cl_device_id *devices,
          cl_uint *num_devices)
      

      设备 id 指针 *devices 可用于创建具有特定数量设备的上下文。

      这是规范的内容

      num_entries 是可以添加到的 cl_device 条目数 设备。如果 devices 不为 NULL,则 num_entries 必须大于 零。 devices 返回找到的 OpenCL 设备列表。 cl_device_id 设备中返回的值可用于识别特定的 OpenCL 设备。如果设备参数为 NULL,则忽略此参数。这 返回的 OpenCL 设备数是该值的最小值 由 num_entries 或其类型的 OpenCL 设备数指定 匹配 device_type。 num_devices 返回 OpenCL 设备的数量 与 device_type 匹配的可用。如果 num_devices 为 NULL,则此 参数被忽略

      cl_context clCreateContext(     
          const cl_context_properties *properties,
          cl_uint num_devices,   // Number of devices 
          const cl_device_id *devices,
          (voidCL_CALLBACK  *pfn_notify) (
              const char *errinfo, 
              const void *private_info, size_t cb, 
              void *user_data
          ),
          void *user_data,
          cl_int *errcode_ret)
      

      然后通过自己的设备队列对每个设备进行寻址。

      【讨论】:

      • 这一切我都知道。也许我并不完全清楚,但我正在寻找一种从“外部”控制设备的方法。类似于 NVIDIA CUDA 驱动提供的环境变量。
      • 好的,太好了!然后发明自己的环境变量或使用 CUDA 并调用 GetEnv()。你应该知道怎么做剩下的......
      【解决方案3】:

      OpenCL 规范没有定义可移植的解决方案。

      NVIDIA 有您提到的解决方案。我认为 AMD 没有标准。您的 OpenCL 程序必须想出一种共享可用设备的方法。

      请注意,AMD 确实有用于“设备裂变”的 OpenCL 扩展(其中一些在 OpenCL 1.2 中变得更加正式),用于在多个程序之间拆分单个设备(但这与您所要求的不同) .

      【讨论】:

      • 我知道 OpenCL 规范没有为此提供机制(除了在上下文中限制设备)。但我会接受你的回答,因为“没有这样的事情”。
      • 如 jprice 所述,实际上可以使用系统变量来完成
      猜你喜欢
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2018-08-06
      • 1970-01-01
      相关资源
      最近更新 更多