cudaGetCacheConfig занимает 0,5 секунды - как и почему?
Я использую CUDA 8.0 в системе на базе Xeon с GTX Titan X (GM 200). Он работает нормально, но - у меня большие накладные расходы по сравнению с моей слабой картой серии GTX 600 дома. В частности, когда я определяю сроки, я обнаруживаю, что cudaGetCacheConfig()
последовательно использует API времени выполнения CUDA невероятное количество времени: 530-560 мс или более 0,5 секунды. Это, в то время как другие звонки не так много. Например, cuDeviceGetTotalMem
занимает 0,7 мс (это тоже немного времени, но на порядок меньше), и cuDeviceGetAttribute
(что, вероятно, ограничено только кодом на стороне хоста) занимает 0,031 мсек.
Почему это происходит? Или скорее - как это могло быть возможно? И могу ли я сделать что-нибудь, чтобы улучшить эту ситуацию?
Заметки:
cudaGetCacheConfig()
вызывается послеcudaGetDeviceCount()
, но, вероятно (не уверен на 100%), не перед любыми другими вызовами API времени выполнения.- Если я допишу
cudaGetDeviceProperties()
позвонить доcudaGetCacheConfig()
первый вызов занимает ~0,6 мс, а второй - более 0,5 с (581 мс в моем последнем измерении).
1 ответ
TL;DR: CUDA ленивая инициализация (как предполагает @RobertCrovella).
@RobertCrovella объясняет в двойном баге:
Инициализация CUDA обычно включает создание UVM, которое включает в себя согласование карт памяти устройства и хоста. Если на вашем сервере больше системной памяти, чем на вашем ПК, это одно из возможных объяснений несоответствия времени инициализации. Операционная система также может оказать влияние, наконец, может повлиять размер памяти графического процессора.
машина, на которой я получаю такое поведение, имеет 256 ГБ памяти, в 32 раза больше, чем моя домашняя машина; и сам GPU имеет 12 ГБ, в 4 раза больше, чем GPU на моей домашней машине. Это означает, что, к сожалению, я могу ожидать гораздо более длительной инициализации драйвера CUDA и / или API времени выполнения, чем на моей домашней машине. Некоторая или вся эта инициализация выполняется лениво, что в моем случае происходит, когда cudaGetCacheConfig()
называется; Я предполагаю, что другие вызовы требуют только некоторой инициализации (хотя не ясно, почему).