OpenCL: Параметры карт ATI.

Столкнулся с тем, что карты 5ххх серии предоставляют лишь часть свободной памяти для использования в OpenCL. На 1Гб-ной EAH5750 доступно 256Мб, к примеру. Мне не удалось найти характеристик карт ATI с точки зрения OpenCL. В частности, мне нужна карта, где доступно хотя бы 512Мб. Но хотелось бы, конечно, взглянуть на таблицу данных по картам ATI -- количество ядер, объемы константной и локальной памяти и объемы глобальной памяти. Нет ли где подобной информации?

Forums: 

5870 про себя пишет Max

5870 про себя пишет Max memory allocation: гигабайт. И памяти на карте - гигабайт.

М. Ок. А можно узнать

М. Ок. А можно узнать производителя, версию OpenCL.dll, и активная ли это карточка?

У меня пишет только 256М...

Производитель - без разницы,

Производитель - без разницы, они все одинаковые. По-моему гигабайт (но развинчивать корпус лень)
OpenCL.dll - от нвидиевского драйвера, но это пофиг, opencl.dll - это просто роутер к реальному dll
Stream SDK 2.01
Карта активна и primary

На самом деле, нужно конечно проверить, может ли оно столько аллоцировать одним куском (возможно что и нет), но вот прямо сейчас немножко не до грибов, вечером попробую не забыть.

код и вывод

  1.         //Get an OpenCL platform
  2.         cl_platform_id cpPlatform;
  3.         clGetPlatformIDs(1, &cpPlatform, NULL);
  4.  
  5.         //Get a GPU device
  6.         cl_uint ciDeviceCount;
  7.         cl_int ciErrNum;
  8.         ciErrNum = clGetDeviceIDs (cpPlatform, CL_DEVICE_TYPE_GPU, 0, NULL, &ciDeviceCount);
  9.         if (ciDeviceCount == 0 || ciErrNum != CL_SUCCESS){
  10.                 printf("No opencl devices!\n");
  11.                 return 0;
  12.         }
  13.  
  14.         //get devices ID
  15.         cl_device_id *devices;
  16.         devices = (cl_device_id*)malloc(sizeof(cl_device_id) * ciDeviceCount);
  17.         clGetDeviceIDs (cpPlatform, CL_DEVICE_TYPE_GPU, ciDeviceCount, devices, &ciDeviceCount);
  18.  
  19.         //get device with maximum number of SMs
  20.     char dev_buf[256];
  21.     size_t szReturn;
  22.         int n_Max_Units = 0;
  23.         cl_device_id cdDevice;
  24.         for (size_t i=0; i<ciDeviceCount; i++){
  25.                 cl_int status = clGetDeviceInfo(devices[i], CL_DEVICE_MAX_COMPUTE_UNITS,  sizeof(dev_buf), dev_buf, &szReturn );
  26.                 int n_Compute_Units = *(int*)dev_buf;
  27.                 if (n_Compute_Units > n_Max_Units){
  28.                         cdDevice = devices[i];
  29.                         n_Max_Units = n_Compute_Units;
  30.                 }
  31.         }
  32.         printf("Units count: %d \n", n_Max_Units);
  33.         cl_int status = clGetDeviceInfo(cdDevice, CL_DEVICE_MAX_MEM_ALLOC_SIZE,  sizeof(dev_buf), dev_buf, &szReturn );
  34.         size_t maxMemorySize = *(int*)dev_buf;
  35.         printf("max memory allocated: %u\n", maxMemorySize);
  36.  
  37.         //free device buffer
  38.         free(devices);
  39.  
  40.         //from ati opencl sample
  41.         cl_int err;
  42.     std::vector< cl::Platform > platformList;
  43.     cl::Platform::get(&platformList);
  44.     //checkErr(platformList.size()!=0 ? CL_SUCCESS : -1, "cl::Platform::get");
  45.         std::cout << "Platform number is: " << platformList.size() << std::endl;
  46.         std::string platformVendor;
  47.     platformList[0].getInfo(CL_PLATFORM_VENDOR, &platformVendor);
  48.     std::cout << "Platform is by: " << platformVendor << "\n";

Units count: 9
Max memory allocated: 268435456
Platform number is: 1
Platform is by: Advanced Micro Devices, Inc.

Слушайте, я вам наврал,

Слушайте, я вам наврал, перепутал вывод, взял не от того устройства

гигабайт - это на CPU (памяти для OpenCL рапортует 4 гига). А на обеих GPU (Nvidia, ATI) - 256M. Памяти - гиг на каждом GPU.

Вот в форумах нашел:
For every buffer object you can allocate 1/4th of the total memory (this is dictated by OpenCL spec, it is not an ATI limitation). For example, if you have 1Gb of total memory you can allocate a maximum of 256Mbytes, if you have 2Gbytes you can allocate 512Mbytes, and so on.

http://forums.amd.com/devforum/messageview.cfm?catid=390&threadid=127849

Я не понимаю, как именно это dictated by OpenCL spec, наизусть их не помню, но готов поверить на слово :)

кое-что можно

кое-что можно посмотреть на этих слайдах: http://sa09.idav.ucdavis.edu/docs/SA09_AMD_IHV.pdf
P.S.: Объем глобалной памяти вообще-то должен быть равен (ну почти) физическому объему. В CAL, например, аллокация большого объема памяти не вызывает проблем, не знаю почему такое ограничение в OpenCL.

в CUDA тоже проблем нет (с

в CUDA тоже проблем нет (с соблюдением ограничений на индексы, ну можно трехмерный массив аллоцировать).

В-общем, это оказалось прямое требование спеков OpenCL (на 34-й странице 1.0.48).

У меня пока есть одна идея, почему это так. В теории мы можем иметь три *независимых* (аж от разных процессов, друг о друге не знающих) процесса
- копирование результатов (предыдущего) расчета с устройства
- (текущий) расчет
- копирование данных (следующего) расчета.

Впрочем, это же предельный

Впрочем, это же предельный лимит для одного объекта, можно 4 объекта аллоцировать?

Опять не успел сегодня попробовать, рутина заела.