我使用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内存信息联系起来?
例如:
由于
修改
在以下答案之后,有一件事我还不清楚:
我使用的内核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);
答案 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 here,and 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)