私は、OpenCL の抽象化と実際のハードウェアとの間のマッピングのより良い直感を開発しようとしています。たとえば、2011 年後半の Macbook pro の構成を使用すると、次のようになります。
1)
Radeon 6770M GPU: http://www.amd.com/us/products/notebook/graphics/amd-radeon-6000m/amd-radeon-6700m-6600m/Pages/amd-radeon-6700m-6600m.aspx#2
「480 ストリーム プロセッサ」は重要な数字だと思います。
2)
一方、OpenCL API では次の数値が得られます。
DEVICE_NAME = ATI Radeon HD 6770M
DRIVER_VERSION = 1.0
DEVICE_VENDOR = AMD
DEVICE_VERSION = OpenCL 1.1
DEVICE_MAX_COMPUTE_UNITS = 6
DEVICE_MAX_CLOCK_FREQUENCY = 675
DEVICE_GLOBAL_MEM_SIZE = 1073741824
DEVICE_LOCAL_MEM_SIZE = 32768
CL_DEVICE_ADDRESS_BITS = 32
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE = 0
CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE = 0
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE = 65536
CL_DEVICE_MAX_WORK_GROUP_SIZE = 1024
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS = 3
CL_DEVICE_MAX_WORK_ITEM_SIZES = (1024, 1024, 1024)
そして、自明なカーネルのワークグループのサイズと倍数を照会します (float4 フォームの入力からグローバルメモリの出力へのパススルー)。
CL_KERNEL_PREFERRED_WORKGROUP_SIZE_MULTIPLE = 64
CL_KERNEL_WORK_GROUP_SIZE = 256
3)
OpenCL 仕様では、ワーク グループ全体がデバイスのコンピューティング ユニットで同時に実行できる必要があると規定されています。
4)
OpenCL は、デバイスの SIMD 幅も倍数で示します。上記の場合は 64 です。
どういうわけか、「6」と「480」と 2 のべき乗を関連付けることができません。計算ユニットの数が 6 で、SIMD 幅が 64 の場合、384 になります。
これらの数値が、特にハードウェアとどのように関係しているか説明できる人はいますか?