我有一个使用 Cuda / C++ 的工作应用程序,但有时,由于内存泄漏,会引发异常。我需要能够实时重置 GPU,我的应用程序是服务器,因此它必须保持可用。
我尝试过类似的方法,但似乎不起作用:
try
{
// do process using GPU
}
catch (std::exception &e)
{
// catching exception from cuda only
cudaSetDevice(0);
CUDA_RETURN_(cudaDeviceReset());
}
Run Code Online (Sandbox Code Playgroud)
我的想法是每次 GPU 出现异常时重置设备,但我无法使其正常工作。:( 顺便说一句,由于某些原因,我无法解决 Cuda 代码的所有问题,我需要一个临时解决方案。谢谢!
假设我有一个与设备关联的活动 CUDA 上下文i
,我现在调用cudaSetDevice(i)
. 发生什么了?:
实际上似乎是不一致的。我写了这个程序,在一台机器上运行一个设备:
#include <cuda.h>
#include <cuda_runtime_api.h>
#include <cassert>
#include <iostream>
int main()
{
CUcontext ctx1, primary;
cuInit(0);
auto status = cuCtxCreate(&ctx1, 0, 0);
assert (status == (CUresult) cudaSuccess);
cuCtxPushCurrent(ctx1);
status = cudaSetDevice(0);
assert (status == cudaSuccess);
void* ptr1;
void* ptr2;
cudaMalloc(&ptr1, 1024);
assert (status == cudaSuccess);
cuCtxGetCurrent(&primary);
assert (status == (CUresult) cudaSuccess);
assert(primary != ctx1);
status = cuCtxPushCurrent(ctx1);
assert (status == (CUresult) cudaSuccess);
cudaMalloc(&ptr2, 1024);
assert (status == (CUresult) cudaSuccess); …
Run Code Online (Sandbox Code Playgroud) 当我开始 cuda 调试时,Nsight 返回此错误:
在当前不可调试的 GPU 上创建了 CUDA 上下文。断点将被禁用。
适配器:GeForce GT 720M
这是我的系统和CUDA信息。
请注意,已安装最新版本的 CUDA 和 Nsight。
我搜索了这个问题,但找不到我的答案。太感谢了。
Run Code Online (Sandbox Code Playgroud)Report Information UnixTime Generated 1490538033 OS Information Computer Name DESKTOP-OLFM6NT NetBIOS Name DESKTOP-OLFM6NT OS Name Windows 10 Pro GetVersionEx dwMajorVersion 10 dwMinorVersion 0 dwBuildNumber 14393 dwPlatformId 2 wServicePackMajor 0 wServicePackMinor 0 wSuiteMask 256 wProductType Workstation GetProductInfo 48 GetNativeSystemInfo wProcessorArchitecture x64 dwPageSize 4096 lpMinimumApplicationAddress 65536 lpMaximumApplicationAddress 140737488289791 dwActiveProcessorMask 15 dwNumberOfProcessors 4 dwAllocationGranularity 65536 wProcessorLevel 6 wProcessorRevision 17665 EnumDisplayDevices Display Device DeviceName \\.\DISPLAY1 DeviceString …
在关于运行时与驱动程序 API 的讨论中,据说
主要上下文根据需要创建,每个设备每个进程一个,并进行引用计数,然后在不再有对它们的引用时销毁。
什么算作此类参考文献?而且——这是否意味着,通常情况下,主要上下文应该在重复使用后立即被销毁?例如,您获得默认设备 ID,然后启动内核;还剩下什么“参考资料”?当然它不是保存设备 ID 的整数变量......
在具有 4 个 NVIDIA GPU 的节点上,我在设备 0 上启用了 ECC 内存保护(所有其他都禁用了 ECC)。由于我在设备 0 上启用了 ECC,我的应用程序(CUDA,仅使用一个设备)在尝试在此设备 0(驱动程序 API)上创建上下文时挂起。我不知道为什么它在那一刻挂起。如果我根据另一台设备使用不同的设备设置 CUDA_VISIBLE_DEVICE 它工作正常。它必须与启用 ECC 有关。有什么想法吗?这里的输出nvidia-smi
:(为什么它报告 99% 不稳定的 GPU 利用率,那里什么都没有运行?)
+------------------------------------------------------+
| NVIDIA-SMI 4.304.54 Driver Version: 304.54 |
|-------------------------------+----------------------+----------------------+
| GPU Name | Bus-Id Disp. | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K20m | 0000:02:00.0 Off | 1 |
| N/A 29C P0 49W / 225W | 0% 12MB / 4799MB …
Run Code Online (Sandbox Code Playgroud)