Я пытаюсь отладить ядро, которое использует некоторые поверхностные объекты и массивы cuda. Для этого я использую NVIDIA NSight с VS2017, отлаживая в режиме Next-Gen. Тем не менее, требуется бесконечно (подождать 10 минут, затем отменить запуск), чтобы выполнить cudaMallocArray
вызовов, которые являются необходимыми вызовами до запуска моего ядра. Есть ли способ обойти это?
Следующий минимальный код, который на самом деле ничего не делает, кроме размещения указанных массивов, выполняется с отладкой NSight вечно.
main.cpp:
#include <cuda_runtime.h>
int main() {
int width = 800;
int height = 600;
// Allocate CUDA arrays in device memory
cudaChannelFormatDesc colorDescription = cudaCreateChannelDesc(8, 8, 8, 8, cudaChannelFormatKindUnsigned);
cudaChannelFormatDesc depthDescription = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
cudaArray *colorArray;
cudaMallocArray(&colorArray, &colorDescription, width, height, cudaArraySurfaceLoadStore);
cudaArray *depthArray;
cudaMallocArray(&depthArray, &depthDescription, width, height, cudaArraySurfaceLoadStore);
return 0;
}
Обновление:
Мне удалось заменить поверхности на простые cudaMalloc
- тот же результат.
Технические характеристики:
- Система: Windows 10 Pro, 64-разрядная (версия 1803, сборка 17134,829)
- GPU: GeForce GTX 780 (обычный, без «Ti» или чего-либо еще)
- Драйвер графического процессора 430.86
- CUDA v. 10.1.168
- Nsight v. 2019.2.0.19109
Edit2:
После дальнейшего изучения я остановил выполнение моей простой программы (с cudaMalloc
вместо массивов), и стек вызовов показывает это:
ntdll.dll!00007ffc9b69b1e4() Unknown
kernel32.dll!00007ffc9aecb093() Unknown
kernel32.dll!00007ffc9af096f5() Unknown
nvcuda.dll!00007ffc4037a38c() Unknown
nvcuda.dll!00007ffc4037a532() Unknown
nvcuda.dll!00007ffc40379dae() Unknown
nvcuda.dll!00007ffc40377b05() Unknown
nvcuda.dll!00007ffc40374515() Unknown
nvcuda.dll!00007ffc405cd13b() Unknown
nvcuda.dll!00007ffc40442807() Unknown
nvcuda.dll!00007ffc4054bb84() Unknown
nvcuda.dll!00007ffc4055abed() Unknown
nvcuda.dll!00007ffc4055aee6() Unknown
nvcuda.dll!00007ffc4055a022() Unknown
nvcuda.dll!00007ffc4054b163() Unknown
nvcuda.dll!00007ffc4040b4c7() Unknown
nvcuda.dll!00007ffc4040ea85() Unknown
nvcuda.dll!00007ffc4030588c() Unknown
nvcuda.dll!00007ffc4049a3e8() Unknown
NSightSlow.exe!cudart::contextStateManager::initPrimaryContext(struct cudart::device *) C++
NSightSlow.exe!cudart::contextStateManager::tryInitPrimaryContext(struct cudart::device *) C++
NSightSlow.exe!cudart::contextStateManager::initDriverContext(void) C++
NSightSlow.exe!cudart::contextStateManager::getRuntimeContextState(class cudart::contextState * *,bool) C++
NSightSlow.exe!cudart::doLazyInitContextState(void) C++
NSightSlow.exe!cudart::cudaApiMalloc(void * *,unsigned __int64) C++
NSightSlow.exe!cudaMalloc() C++
> NSightSlow.exe!main() Line 10 C++
NSightSlow.exe!invoke_main() Line 79 C++
NSightSlow.exe!__scrt_common_main_seh() Line 288 C++
NSightSlow.exe!__scrt_common_main() Line 331 C++
NSightSlow.exe!mainCRTStartup() Line 17 C++
kernel32.dll!00007ffc9aec4034() Unknown
ntdll.dll!00007ffc9b6d3691() Unknown
Кажется, это связано с (ленивым) созданием контекста при первом вызове функции CUDA. Это может не относиться конкретно к cudaMalloc
.