Я использую Tesla m1060 для вычисления GPGPU. Она имеет following specs:OpenCL и Tesla M1060
# 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 ядер» графического процессора с рабочими группами/элементами?
- Как я могу сопоставить рабочие группы с ним (каково будет количество рабочих групп)?
Благодаря
EDIT:
После следующих ответов, есть вещь, которая до сих пор неясно мне:
Значение CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE
32 для ядра я использую.
Однако мое устройство имеет CL_DEVICE_MAX_COMPUTE_UNITS
значение 30.
В OpenCL 1.1 Апи, написано (стр. 15):
Compute Unit: An OpenCL device has one or more compute units. A work-group executes on a single compute unit
кажется, что либо что-то бессвязное здесь, или что я не совсем понял разницу между рабочими группами и вычислительными единицами.
Как отмечалось ранее, когда я установил число рабочих групп до 32, программы выдает следующее сообщение об ошибке:
Entry function uses too much shared data (0x4020 bytes, 0x4000 max).
Значение 16 работ.
Добавление
Вот моя Kernel подпись:
// 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);
можете ли вы разместить код ядра, пожалуйста? по крайней мере, части, определяющие объем локальной памяти. если это динамично, отправьте сообщения clenqueuendrangekernel и clsetkernelarg из вашего кода хоста. – mfa
также, если «установить количество групп до 32», вы имеете в виду, что вы удваиваете глобальный размер, или вы вдвое уменьшаете размер рабочей группы? – mfa
спасибо за добавление кода. Какие переменные являются локальными в ядре? кажется, что вы выделяете 2 * (BLOCK_SIZE^2) * 8 байтов для удвоений, а еще 32 байта за пределами этого. Это дополнительные 32 байта, которые вы превысили лимит для вашего устройства. – mfa