[非常离谱] cudaSetDevice和cudaDeviceReset导致程序bug

4 篇文章 0 订阅
2 篇文章 0 订阅

省流:cudaSetDevice和cudaDeviceReset可能导致不可控的memory leak

解决方案:Adding cudaDeviceSynchronize() after cudaSetDevice and before cublasCreate()。

今天测试了一个刚写好的包含cuda的代码。大致流程是 cudaSetDevice, cudaDeviceReset初始化-> CPU读取文件 -> cuda相关代码运行 -> ...

然后遇到了一个百思不得七姐的问题。

我CPU读取文件的代码就一个function,单独测试的时候怎么都没问题,在这个cuda里运行的时候就会出很奇怪的bug。因为是纯cpu代码,单独测试的时候是g++编译,cuda是nvcc编译,我首先是怀疑编译器的问题,还考虑-O2开关的问题,但并没发现什么问题。

然后我调整了代码的位置,把cpu读文件的函数放在最最最前面,成功通过。然后慢慢换位置,发现是cudaSetDevice和cudaDeviceReset导致的,这两个calling我尝试只保留其中的一个,也依然导致bug。只有全部注释掉,CPU代码才能正常运行。然后StackOverflow上发现了同样的问题:cuda - cudaDeviceReset causes memory leak? - Stack Overflow

所以咱就是说,有没有家人遇到类似的问题,是别人猜测的cuda这两个函数导致的memory leak的问题吗?

我的环境:

Ryzen7 5800H, RTX3060 laptop

Ubuntu Linux 20.04 on WSL2 Windows 11

gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)

Cuda compilation tools, release 11.5, V11.5.119

Matlab的系统辨识(System Identification)是用于估计动态系统模型的过程,比如线性或非线性的传递函数。在某些情况下,模型可能会出现偏差,这可能是由于以下几个原因: 1. 数据质量:如果输入和输出数据有噪声、缺失或不一致,模型会受到影响,导致估计偏差大。 2. 模型选择:选择过于简单的模型可能无法捕捉复杂的系统行为,而过于复杂的模型可能导致过拟合,即在训练数据上表现很好,但在新数据上性能较差。 3. 参数估计算法:不同的辨识方法(如最小二乘法、粒子滤波等)对噪声敏感度不同,选择不合适的方法可能导致结果偏离。 4. 系统动态特性:如果系统包含滞后的响应、非线性效应或其他难以用线性模型描述的部分,模型会偏斜。 5. 初始化设置:辨识算法的初始设置,如阶数选择、过程模型类型等,如果设定不当,可能导致结果偏离真实值。 解决方法包括: - 收集高质量的数据:确保输入和输出信号稳定,没有异常值。 - 选择合适的模型:尝试不同的模型结构,使用AIC或BIC等信息准则来评估复杂度。 - 使用适当的算法:例如,对于非线性系统,可以考虑采用自适应辨识或机器学习方法。 - 逐步调整参数:通过迭代或优化算法调整模型参数,使其更好地拟合数据。 - 进行实验设计:合理安排实验,增加观测数据的多样性,提高模型的准确性。 如果你遇到具体的问题,提供更多的细节(比如使用的模型、数据特点、估计结果与实际表现的对比等),我可以帮助分析问题所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值