Я использую 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 мсек в последнем измерении).
Является ли 'cudaGetCacheConfig' первым вызовом API cuda runtime в программе, которую вы выбираете? –
@RobertCrovella: Нет, см. Править. – einpoklum
Если он достаточно ранний в вашей программе, он все равно может поглотить часть ленивых издержек инициализации CUDA. Попытайтесь положить 'cudaGetCacheConfig()' где-то ближе к концу вашего кода после вызова 'cudaDeviceSynchronize()' и посмотреть, было ли время профайлера более коротким для него. –