从上周开始,我的CUDA开发设置出现了很大问题.我有一个集成的GPU,我也连接了我的显示器和一个额外的NVIDIA卡,用于运行我的CUDA内核.但是,我不能再调试我的代码,因为它说:
fatal: All CUDA devices are used for display and cannot be used while debugging. (error code = CUDBG_ERROR_ALL_DEVICES_WATCHDOGGED(0x18)
Run Code Online (Sandbox Code Playgroud)
不知何故,似乎我的X-Server阻止了我的NVIDIA GPU,因为如果我切换到另一个虚拟控制台(CTRL + ALT + F1),我可以使用cuda-gdb运行我的代码.没有显示器电缆插入NVIDIA卡...
"lsof/dev/nvidia*"不提供任何输出.我正在使用Xubuntu 14.04.
有谁知道如何解决这个问题?
我正在调试cuda程序,并收到以下警告:
warning: Cuda API error detected: cudaMemcpy returned (0xb)
warning: Cuda API error detected: cudaMemcpy returned (0xb)
warning: Cuda API error detected: cudaGetLastError returned (0xb)
Error in kernel
GPUassert: invalid argument
Run Code Online (Sandbox Code Playgroud)
当我在cuda-gdb中键入“ where”时,它显示“ no stack”。
(cuda-gdb) where
No stack.
Run Code Online (Sandbox Code Playgroud)
如何找到我的程序崩溃的地方?
我有一个相当大而复杂的CUDA代码,可以很好地挂起大量的块/线程.我试图找出代码挂起的确切位置.
当我运行代码时cuda-gdb,我可以看到哪些线程/块挂起,但我无法看到"虚拟PC"之外的位置.
如果我使用"-G"编译代码来获取调试信息,那么无论我运行多长时间,它都会运行得慢很多并且拒绝挂起.
有没有办法将"虚拟PC"映射到源代码中的一行代码,甚至大约?或者有没有办法在不关闭所有优化的情况下获取调试信息?
我尝试过使用"-G3",但无济于事.这只是给了我"#nvcc warning : Setting optimization level to 0 as optimized debugging is not supported" 类型的警告.我正在使用CUDA编译工具4.1版.
我正在尝试解决CUDA运行时错误.cuda-gdb报告的调试信息(使用cuda-memcheck):
warning: Cuda API error detected: cudaLaunch returned (0xb)
warning: Cuda API error detected: cudaGetLastError returned (0xb)
[Thread 0x7fa1a28c5700 (LWP 43041) exited]
[Thread 0x7fa1a16a5700 (LWP 43042) exited]
[Thread 0x7fa18df0e700 (LWP 43056) exited]
Run Code Online (Sandbox Code Playgroud)
我检查了块,网格尺寸和正在使用的动态共享内存的大小,它们远低于限制.请告诉我什么(0xb)错误类型代表,我没有在cuda文档中找到它.另外,请告诉我有关如何解决此问题的任何建议?
设备:开普勒K20(CC = 3.5)和CUDA 5.5
代码太大,无法在此粘贴.
我在 Ubuntu 16.04 上使用 Nsight。我当前的设置允许我通过 nsight IDE 完美地编译和运行我的代码。在确保程序是在调试模式下构建的(最初不是)后,它最终允许我单步调试我的代码。
我遇到的问题是每当我尝试调试代码时,所有变量都显示“不可用”。另外,如果我将鼠标悬停在变量上,它会显示类似“-var-create:无法创建变量对象”之类的内容。这看起来可能是编译器的问题?也许它没有添加它应该做的事情?
Nsight 版本为 7.5,GCC & G++ 版本为 5.3.1,GDB 版本为 7.11,NVCC 版本为 7.5.17。
我遇到一个非常奇怪的错误,因为我在运行特定大小的Heat 2D模拟时遇到"非法内存访问"错误,但如果运行完全相同的模拟,模拟运行良好,只需少量元素.
是否有理由增加数组的大小会导致此异常?我正在使用Titan Black GPU(6 GB内存),但我正在运行的模拟远不是那么大.我计算出我可以运行4000 x 4000模拟,但是如果我超过250 x 250就会出错.
我在设备上实例化模拟对象数组后立即发生错误.实例化代码如下:
template<typename PlaceType, typename StateType>
__global__ void instantiatePlacesKernel(Place** places, StateType *state,
void *arg, int *dims, int nDims, int qty) {
unsigned idx = blockDim.x * blockIdx.x + threadIdx.x;
if (idx < qty) {
// set pointer to corresponding state object
places[idx] = new PlaceType(&(state[idx]), arg);
places[idx]->setIndex(idx);
places[idx]->setSize(dims, nDims);
}
}
template<typename PlaceType, typename StateType>
Place** DeviceConfig::instantiatePlaces(int handle, void *argument, int argSize,
int dimensions, int size[], int qty) {
// add …Run Code Online (Sandbox Code Playgroud) 在CUDA应用程序抛出异常后,CUDA文档不清楚内存数据如何变化.
例如,内核启动(动态)遇到异常(例如Warp超出范围的地址),将停止当前的内核启动.在此之后,设备上的数据(例如__device__变量)是否仍然保留,或者它们是否与例外一起被删除?
一个具体的例子是这样的:
有人能说明这背后的理由吗?
假设我有这个__device__功能:
__device__ unsigned char* dev_kernel(unsigned char* array_sh, int params){
return array_sh + params;
}
Run Code Online (Sandbox Code Playgroud)
在__global__内核中,我以这种方式使用它:
uarray = dev_kernel (uarray, params);
Run Code Online (Sandbox Code Playgroud)
uarray共享内存中的数组在哪里?
但是当我使用CUDA-gdb来看到的地址的情况uarray中的__global__内核,我得到:
(@generic unsigned char * @shared) 0x1000010 "z\377*"
Run Code Online (Sandbox Code Playgroud)
在__device__内核中,我得到:
(unsigned char * @generic) 0x1000010 <Error reading address 0x1000010: Operation not permitted>
Run Code Online (Sandbox Code Playgroud)
尽管有错误,程序仍可以正常运行(也许是cuda-gdb的某些限制)。
所以,我想知道:在__device__内核中,uarray是共享的吗?我将阵列从全局内存更改为共享内存,时间几乎相同(对于共享内存,时间会更糟)。