2017-02-10 5 views
0

Я использую 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 занимает 0,5 секунды - как/почему?

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

Примечания:

  • cudaGetCacheConfig() вызывается после cudaGetDeviceCount(), но, вероятно, (не 100% уверен) не до каких-либо других вызовов во время выполнения API.
  • Если я дождался вызова cudaGetDeviceProperties() перед вызовом cudaGetCacheConfig(), первый принимает ~ 0,6 мс, а последний по-прежнему занимает более 0,5 с (581 мсек в последнем измерении).
+0

Является ли 'cudaGetCacheConfig' первым вызовом API cuda runtime в программе, которую вы выбираете? –

+0

@RobertCrovella: Нет, см. Править. – einpoklum

+2

Если он достаточно ранний в вашей программе, он все равно может поглотить часть ленивых издержек инициализации CUDA. Попытайтесь положить 'cudaGetCacheConfig()' где-то ближе к концу вашего кода после вызова 'cudaDeviceSynchronize()' и посмотреть, было ли время профайлера более коротким для него. –

ответ

0

TL; DR: CUDA ленивая инициализация (как предлагает @RobertCrovella).

@RobertCrovella объясняет в dupe bug:

инициализации CUDA обычно включает в себя создание УВМ, который включает в себя гармонизацию карт памяти устройства и хост. Если на вашем сервере больше системной памяти, чем на вашем ПК, это одно из возможных объяснений несоответствия времени инициализации. ОС также может иметь эффект, и, наконец, размер памяти графического процессора может иметь эффект.

Машина, на которой я получаю это поведение, имеет 256 ГБ памяти, в 32 раза больше, чем моя домашняя машина; и сам графический процессор имеет 12 ГБ, что в 4 раза больше, чем у графического процессора на моей домашней машине. Это означает, что я, к сожалению, могу ожидать гораздо более длительную инициализацию драйвера CUDA и/или интерфейса выполнения, чем на моем домашнем компьютере. Некоторая или вся эта инициализация выполняется ленивым способом, который в моем случае случается, когда вызывается cudaGetCacheConfig(); Я полагаю, что другие вызовы требуют только некоторой инициализации (непонятно, почему, хотя).

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