OpenCL和特斯拉M1060

时间:2014-11-21 10:59:25

标签: opencl gpu tesla

我使用Tesla m1060进行GPGPU计算。它有following specs

# 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内存信息联系起来?

例如:

  • " Memory Interace"意思?它是否与工作项链接?
  • 如何关联" 240内核" GPU工作组/项目?
  • 如何将工作组映射到它(要使用的工作组数量是多少)?

由于

修改

在以下答案之后,有一件事我还不清楚:

我使用的内核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);

2 个答案:

答案 0 :(得分:2)

内存接口对opencl应用程序没有任何意义。它是存储器控制器用于读/写存储器的位数(现代gpus中的ddr5部分)。最大全局内存速度的公式大约是:pipelineWidth * memoryClockSpeed,但由于opencl意味着跨平台,除非你试图找出内存性能的上限,否则你真的不需要知道这个值。 。当您处理内存合并时,了解512位接口会有所帮助。维基:Coalescing (computer science)

最大工作项大小与1)硬件如何计划计算,以及2)设备上的低级内存量有关 - 例如。私人记忆和本地记忆。

240这个数字对opencl来说并不重要。您可以确定30个计算单元中的每一个都由8个流处理器核心组成,用于此gpu架构(因为240/30 = 8)。如果您查询CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE,它将非常类似于此设备的8的倍数。见:clGetKernelWorkGroupInfo

我已回答了有关工作组规模的类似问题。 see hereand here

最终,您需要根据自己的基准测试结果调整应用程序和内核。我觉得值得花时间编写各种工作组大小的测试,并最终硬编码最佳大小。

答案 1 :(得分:1)

添加另一个答案以解决您的本地内存问题。

  

输入功能使用过多的共享数据( 0x4020字节,最大0x4000

由于您正在分配A_sub和B_sub,每个都具有32 * 32 * sizeof(double),因此您的本地内存不足。该设备应该允许您分配16kb或0x4000字节的本地内存而不会出现问题。

0x4020比设备允许的数量多32个字节或4倍。我可以想到的只有两件事可能导致错误:1)您的设备或驱动程序可能存在错误,导致您无法分配完整的16kb,或者2)您正在内核中的其他位置分配内存。 / p>

您现在必须使用小于32的BLOCK_SIZE值才能解决此问题。

虽然有好消息。如果您只想将CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE的倍数作为工作组大小,BLOCK_SIZE = 16已经为您执行此操作。 (16 * 16 = 256 = 32 * 8)。要更好地利用本地内存,请尝试BLOCK_SIZE = 24。 (576 = 32×18)