Как правильно задавать конфигурацию грида?

257 views
Skip to first unread message

Алексей Вахтин

unread,
Sep 9, 2013, 12:08:29 PM9/9/13
to CUDA.CS.MSU.SU
По просьбе Дмитрия меняю название темы. Почему-то нигде не нашел ответа, как наиболее правильно задавать эту конфигурацию.

1) Возможность или невозможность запуска конфигурации ограничена не только размерностями, но и, например, числом регистров. Почитайте об этом в книге или в доках. Скорее всего работающий/не работающий случаи объясняются именно этим.
 
Знать бы, в каких доках или книгах. По крайней мере, в книге Д.Сандес, Э.Кэндрот Технология CUDA в примерах этого нет, в доках, что устанавливаются вместе с CUDA toolkit что-то тоже не нашел.
 
2) Непонятно, какой смысл запускать ядро с гридом, не зависящим от размера самой задачи. Скажем вот с uint64_t N_block = prop.maxGridSize[0] будет честно запущен миллиард блоков. На свободном GPU это будет считаться очень долго, а на GPU с таймаутом драйвер остановит ядро через небольшое время и выдаст ошибку (как раз упоминаемый Вами "сбой драйвера").
 
Вообще, у меня есть функция, которая вычисляла число нитей N_thread и блоков N_block такое, чтобы N_thread*N_block было наименьшим из чисел, больших или равных необходимому числу нитей. Соответственно, число нитей и блоков ограничено максимально возможными.

Например, в моем примере https://groups.google.com/d/msg/cudacsmsusu/mrVzyzOMQxk/eXAj9exn7OAJ используется N_block=1 и N_thread=1024, а когда возникла ошибка драйвера использовался N=40000, M=6000, fromM=350, соответсвенно, нитей требуется 5651, процедура посчитала, что нужно задать 5651 блоков с 1 нитью (с учетом того, что максимальное число нитей в блоке 1024).




С уважением, Вахтин А. А.

Mikhail Smirnov

unread,
Sep 9, 2013, 12:27:30 PM9/9/13
to cudac...@googlegroups.com

Alexei,

Please, take a look at this thread
http://stackoverflow.com/questions/4391162/cuda-determining-threads-per-block-blocks-per-grid

M

--
Вы получили это сообщение, поскольку подписаны на группу CUDA.CS.MSU.SU.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес cudacsmsusu...@googlegroups.com.
Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу cudac...@googlegroups.com.
Перейдите в группу по ссылке http://groups.google.com/group/cudacsmsusu.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

Алексей Вахтин

unread,
Sep 9, 2013, 3:04:42 PM9/9/13
to CUDA.CS.MSU.SU
Спасибо, Михаил.

Из статьи понял, что лучше всего задавать число нитей в блоках кратным 32 и производительность ограничена числом активных блоков и потоков. Например, в CUDA с вычислительной мощностью (Compute capability) 2.0 максимальное число блоков на мультипроцессор - 8, максимальное число нитей - 1536. Количество мультипроцессоров в видеокарте можно получить с помощью API. Соответственно, если, например, у меня их 4, то максимальное число блоков целесообразнее будет задавать 8x4=32, и число нитей не более 1536x8=12288.

И все же мне не понятно, почему у меня (https://groups.google.com/d/msg/cudacsmsusu/mrVzyzOMQxk/eXAj9exn7OAJ) при CC 2.0 если задать число блоков - 1, а число нитей 1024 не работает, а если задать число блоков равным 2, а число нитей 512 - все работает. И сообщений об ошибке нет.

9 сентября 2013 г., 20:27 пользователь Mikhail Smirnov <3.1415...@gmail.com> написал:
С уважением, Вахтин А. А. 

Dmitry N. Mikushin

unread,
Sep 15, 2013, 7:38:36 PM9/15/13
to cudac...@googlegroups.com
Ну можно только сказать, что Ваш код на CC 2.0 работает (см. ниже). Проверил и 32-битную, и 64-битную сборку. Значения под циклам менял, выводит так, как меняется.

dmikushin@tesla-cmc:~/forge/vakhtin$ cat vakhtin.cu | grep -C 2 "maxThreadsPerBlock"
    prop.major = 2;
    prop.minor = 0;
    prop.maxThreadsPerBlock = M - fromM;
    CUDA_SAFE_CALL(cudaChooseDevice(&N_Dev, &prop));
    CUDA_SAFE_CALL(cudaSetDevice(N_Dev));
--

    //(************************ если здесь поменять, то будет работать ****************************)
    int N_thread = min(prop.maxThreadsPerBlock, prop.maxThreadsDim[0]);
    int N_block = 1;
    //(******************************************************************************************************)


dmikushin@tesla-cmc:~/forge/vakhtin$ CUDA_VISIBLE_DEVICES=2 deviceQuery
deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "Tesla C2075"
  CUDA Driver Version / Runtime Version          5.5 / 5.5
  CUDA Capability Major/Minor version number:    2.0
  Total amount of global memory:                 5375 MBytes (5636554752 bytes)
  (14) Multiprocessors x ( 32) CUDA Cores/MP:    448 CUDA Cores
  GPU Clock rate:                                1147 MHz (1.15 GHz)
  Memory Clock rate:                             1566 Mhz
  Memory Bus Width:                              384-bit
  L2 Cache Size:                                 786432 bytes
  Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65535), 3D=(2048,2048,2048)
  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  1536
  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
  Run time limit on kernels:                     No
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Enabled
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Bus ID / PCI location ID:           2 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 5.5, CUDA Runtime Version = 5.5, NumDevs = 1, Device0 = Tesla C2075
Result = PASS
dmikushin@tesla-cmc:~/forge/vakhtin$ CUDA_VISIBLE_DEVICES=2 ./vakhtin
0: 400.000000
1: 400.000000
2: 400.000000
3: 400.000000
4: 400.000000
...


9 сентября 2013 г., 23:04 пользователь Алексей Вахтин <alva...@gmail.com> написал:

--

Алексей Вахтин

unread,
Sep 16, 2013, 1:51:09 AM9/16/13
to CUDA.CS.MSU.SU
Ядро не работает, если использовать в ядре sin и cos и задать число нитей в блоке больше 768. Проблема в том, что не хватает регистров.  Функцией cudaGetLastError() выпадает ошибка с кодом 9. В интернете подсказали, что для расчета числа нитей в блоке используется CUDA_Occupancy_calculator.xls, который поставляется вместе с пакетом CUDA ToolKit. В справке написано, что число регистров можно узнать скомпилировав программу с ключом --ptxas-options=-v. Как оказалось, число регистров в 2.0 для этих тригонометрических функций используется больше, чем в 1.1. Но, в принципе, нет худа без добра, с помощью этого калькулятора я узнал какое число нитей нужно задавать чтобы получить максимальную производительность. Производительность увеличилась на порядок.


16 сентября 2013 г., 3:38 пользователь Dmitry N. Mikushin <maem...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages