OpenCL显示2个单元,而我的GPU设备物理上有许多核心-为什么?

OpenCL显示2个单元,而我的GPU设备物理上有许多核心-为什么?,opencl,gpu,distributed-system,mql5,Opencl,Gpu,Distributed System,Mql5,我正在尝试用OpenCL运行我的程序 我在日志中看到了以下信息: OpenCL device #0: GPU NVIDIA Corporation GeForce GT 730 with OpenCL 1.2 (2 units, 901 MHz, 4096 Mb, version 391.35) OpenCL device #1: GPU NVIDIA Corporation GeForce GT 730 with OpenCL 1.2 (2 units, 901 MHz, 4096 Mb, v

我正在尝试用OpenCL运行我的程序

我在日志中看到了以下信息:

OpenCL device #0: GPU NVIDIA Corporation GeForce GT 730 with OpenCL 1.2 (2 units, 901 MHz, 4096 Mb, version 391.35)
OpenCL device #1: GPU NVIDIA Corporation GeForce GT 730 with OpenCL 1.2 (2 units, 901 MHz, 4096 Mb, version 391.35)
OpenCL device #2: CPU Intel(R) Corporation Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz with OpenCL 2.1 (8 units, 4000 MHz, 16300 Mb, version 7.0.0.2567)

根据以上信息,我猜我的GPU设备有两个单元作为工作项

在使用CudaZ实用程序检查我的GPU设备的规格后,我发现我在[PCI_LOC=0:1:0]中报告了一个GPU设备的384个内核

如图所示:

clinfo
显示以下内容:

我的问题是,当我有384个核心,那么为什么有2个单位显示?其次,当我有很多内核时,openCL是如何分配任务的,是在每个内核上都有相同的进程和相同的数据,还是在不同的内核上有不同的数据

我的问题是当我有384个内核时,为什么会显示2个单元

简单,
GPU计算设备不同于任何通用CPU CISC/RISC计算设备,具有其他硅硬连线架构

这里的原因非常重要

GPU设备使用多处理器eX执行单元(SMX单元),在一些硬件检查工具中引用

虽然SMX缩写中的字母M强调,SMX单元上可加载多个执行,但所有此类情况实际上都会执行(当然,只有以超出本主题范围的方式进行指示,才能覆盖/跨越每个SMX现有SM核)同样的计算指令——这是它们可以操作的唯一方式——它被称为“SIMD”
——一种仅在SMX周边可实现的有限并行范围(共局部),其中,ssingle-i指令-mmultiple-data可以在现有的单指令多数据(经宽|半经宽)调度程序功能内执行

上面列出的384个内核意味着硬件限制,超过这个限制,这种有限范围并行的本地协同SIMD类型将无法增长,所有朝这个方向的尝试都将导致GPU作业的纯内部调度(是的,即一个接一个)

理解这些基本知识是至关重要的,因为如果没有这些体系结构特征,人们可能会期望出现一种行为,这种行为实际上不可能在任何类型的GPGPU系统中得到协调,其形式为自治的,异步星形节点

从CPU主机加载到GPU上的任何GPU内核都将映射到一组非空的SMX单元上,在该单元中,使用SIMD指令流加载指定数量的内核(另一个更细粒度的计算资源几何体,同样超出了本文的范围),而不违反GPU设备限制:

 ...
+----------------------------------------------------------------------------------------
 Max work items dimensions:          3       // 3D-geometry grids possible
    Max work items[0]:               1024    // 1st dimension max.
    Max work items[1]:               1024
    Max work items[2]:               64      // theoretical max. 1024 x 1024 x 64 BUT...
+----------------------------------------------------------------------------------------
 Max work group size:                1024    // actual      max. "geometry"-size
+----------------------------------------------------------------------------------------
 ...

所以

  • 如果1-SM-core被内部指示执行某个GPU任务单元(GPU作业),则仅此SM-core将获取一条接一条GPU RISC指令(为简单起见,忽略任何可能的ILP),并在所述GPU作业的SIMD指令流中一次执行一条。在这段时间内,同一SMX单元上的所有剩余SM内核通常都不会执行任何操作,直到该GPU作业完成,并且内部GPU进程管理系统决定为此SMX映射一些其他工作

  • 如果2-SM-cores被指示执行某个GPU作业,则仅此对SM-cores将一条接一条(以及非常相同的)GPU RISC指令(为简单起见,忽略任何可能的ILP),并两个一次执行一条,单步执行所述GPU作业的SIMD指令流。在这种情况下,如果一个SM内核进入一种状态,其中一个
    if
    -ed或类似分支的执行流使一个SM内核进入另一个代码执行流路径,则SIMD-并行性进入发散场景,其中一个SM内核获得下一条SIMD指令,属于它的代码执行路径,而另一个不做任何事情(获取GPU_NOP),直到第一个完成整个作业(或者在等待从“远”获取数据时被迫在某个同步障碍处停止),进入不可伪装的延迟等待状态(慢)非本地内存位置,同样,细节远远超出了本文的范围)-只有在发生任何一种情况后,发散路径,到目前为止,只有GPU NOP-ed SM内核可以接收任何下一条SIMD指令,属于其(发散)代码执行路径,以向前移动。在这段时间内,同一SMX单元上的所有剩余SM内核通常都不会执行任何操作,直到该GPU作业完成,并且内部GPU进程管理系统决定为此SMX映射一些其他工作

  • 如果任务特定的“几何体”指示16个SM核执行某个GPU作业,则仅此“群”SM核将一个接一个(以及非常相同的)GPU RISC指令(为简单起见,忽略任何可能的ILP)并全部一次执行一条,单步执行所述GPU作业的SIMD指令流。“群”内部的任何分歧都会降低SIMD效应,并且
    GPU\u NOP
    -阻塞的内核仍在等待“群”的主要部分完成作业(与此点上方的草图相同)

不管怎么说,所有其他的SM核心,没有
  ...
 +---------------------------------------------------------
  ...                                               901 MHz
  Cache type:                            Read/Write
  Cache line size:                     128
  Cache size:                        32768
  Global memory size:           4294967296
  Constant buffer size:              65536
  Max number of constant args:           9
  Local memory size:                 49152
 +---------------------------------------------------------
  ...                                              4000 MHz
  Cache type:                            Read/Write
  Cache line size:                      64
  Cache size:                       262144
  Global memory size:            536838144
  Constant buffer size:             131072
  Max number of constant args:         480
  Local memory size:                 32768
 +---------------------------------------------------------
  ...                                              1300 MHz
  Cache type:                            Read/Write
  Cache line size:                      64
  Cache size:                       262144
  Global memory size:           1561123226
  Constant buffer size:              65536
  Max number of constant args:           8
  Local memory size:                 65536
 +---------------------------------------------------------
  ...                                              4000 MHz
  Cache type:                            Read/Write
  Cache line size:                      64
  Cache size:                       262144
  Global memory size:           2147352576
  Constant buffer size:             131072
  Max number of constant args:         480
  Local memory size:                 32768