2014-01-08 3 views
2

Я использую последнюю версию CUDA 5.5, а новый CUBLAS имеет состояние, при котором каждая функция нуждается в cublasHandle_t, например.Должны ли мы повторно использовать cublasHandle_t для разных вызовов?

cublasHandle_t handle; 
    cublasCreate_v2(&handle); 
    cublasDgemm_v2(handle, A_trans, B_trans, m, n, k, &alpha, d_A, lda, d_B, ldb, &beta, d_C, ldc); 
    cublasDestroy_v2(handle); 

это хорошая практика, чтобы повторно использовать эту ручку экземпляра как можно больше, как какие-то Session или влияние на производительности будет настолько мало, что имеет смысл снизить сложность коды, имея короткоживущую ручку и, следовательно, создавать/уничтожать его непрерывно?

+2

Создание или разрушение нескольких дескрипторов cuBLAS может нарушить параллелизм с помощью ненужных контекстных синхронизаций. – JackOLantern

+1

Кроме того, из руководства пользователя библиотеки cuBLAS, '' cublasCreate() '[...] выделяет аппаратные ресурсы на хосте", поэтому, возможно, есть некоторые накладные расходы на его вызов. – JackOLantern

+0

Стоит также скопировать это из документации: _ «Поскольку cublasCreate выделяет некоторые внутренние ресурсы и выпуск этих ресурсов, вызывая cublasDestroy, будет неявно вызывать cublasDeviceSynchronize, рекомендуется свести к минимуму количество событий cublasCreate/cublasDestroy." _ – Allan

ответ

6

Я думаю, что это хорошая практика, по двум причинам:

  1. Из Руководства пользователя cuBLAS Library «cublasCreate() [...] выделяет аппаратные ресурсы на хосте», который заставляет меня думать, что есть некоторые накладные расходы на его вызов.
  2. Несколько созданий/разрушений дескриптора cuBLAS могут нарушить параллелизм с помощью ненужных контекстных синхронизаций.
1

Как утверждает CUDA Toolkit в here

Приложение должно инициализировать ручку к cuBLAS библиотеки контекста, вызвав функцию cublasCreate(). Затем контекст явно передается каждому последующему вызову функции библиотеки. Как только приложение закончит с помощью библиотеки, оно должно вызывать функцию cublasDestory() до освободить ресурсы, связанные с контекстом библиотеки cuBLAS.

Смежные вопросы