我正在使用 Tesla m1060 进行 GPGPU 计算。它具有以下规格:
# of Tesla GPUs 1
# of Streaming Processor Cores (XXX per processor) 240
Memory Interface (512-bit per GPU) 512-bit
当我使用 OpenCL 时,我可以显示以下板子信息:
available platform OpenCL 1.1 CUDA 6.5.14
device Tesla M1060 type:CL_DEVICE_TYPE_GPU
max compute units:30
max work item dimensions:3
max work item sizes (dim:0):512
max work item sizes (dim:1):512
max work item sizes (dim:2):64
global mem size(bytes):4294770688 local mem size:16383
如何将 GPU 卡信息与 OpenCL 内存信息相关联?
例如:
- “内存交互”是什么意思?它是否链接了工作项?
- 如何将 GPU 的“240 核”与工作组/项目相关联?
- 如何将工作组映射到它(要使用的工作组数量是多少)?
谢谢
编辑:
在以下答案之后,我仍然不清楚一件事:
我使用的内核的CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE
值为 32。
但是,我的设备的CL_DEVICE_MAX_COMPUTE_UNITS
值为 30。
在 OpenCL 1.1 Api 中,它是这样写的(第 15 页):
计算单元:一个 OpenCL 设备有一个或多个计算单元。工作组在单个计算单元上执行
似乎有些东西在这里不连贯,或者我没有完全理解工作组和计算单元之间的区别。
如前所述,当我将工作组的数量设置为 32 时,程序失败并出现以下错误:
Entry function uses too much shared data (0x4020 bytes, 0x4000 max).
值 16 有效。
附录
这是我的内核签名:
// enable double precision (not enabled by default)
#ifdef cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
#else
#error "IEEE-754 double precision not supported by OpenCL implementation."
#endif
#define BLOCK_SIZE 16 // --> this is what defines the WG size to me
__kernel __attribute__((reqd_work_group_size(BLOCK_SIZE, BLOCK_SIZE, 1)))
void mmult(__global double * A, __global double * B, __global double * C, const unsigned int q)
{
__local double A_sub[BLOCK_SIZE][BLOCK_SIZE];
__local double B_sub[BLOCK_SIZE][BLOCK_SIZE];
// stuff that does matrix multiplication with __local
}
在主机代码部分:
#define BLOCK_SIZE 16
...
const size_t local_work_size[2] = {BLOCK_SIZE, BLOCK_SIZE};
...
status = clEnqueueNDRangeKernel(command_queue, kernel, 2, NULL, global_work_size, local_work_size, 0, NULL, NULL);