CUDA exited with code -1073740940 (0xc0000374)

本文探讨了使用CUDA实现图像负片效果时遇到的计算偏差和内存错误问题。通过调整代码,解决了常量计算错误,并修复了因sizeof类型不匹配导致的内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天用CUDA实现图像负片效果

目录

问题描述

问题分析

1. 计算结果有偏差

2. exited with code -1073740940 (0xc0000374)

解决方案

综述


问题描述

1. 计算结果有偏差

2. exited with code -1073740940 (0xc0000374)


问题分析

1. 计算结果有偏差

cudaError_t supplementPix(uchar *c, const uchar *a, unsigned int size);

__global__ void supplementKernel(int *c, const int *a)
{
	int i = threadIdx.x;
    c[i] = 255 - a[i]; // 常量计算会导致运算错误,比如 255 - 1=253
}

运行结果

后来创建全255、CV_8UC3的cv::Mat对象,提取data数组作为被减数

cv::Mat mask = cv::Mat(rows, cols, CV_8UC3, cv::Scalar::all(255));
	// 常量计算会导致运算错误,比如 255 - 1=253
	// 必须使用数组传参
const uchar* maskData = mask.data;

运行结果正确:

但是出现了新的问题


2. exited with code -1073740940 (0xc0000374)

查找相关信息

《Exit code -1073740940》(https://www.baidu.com/link?url=ud0ZNzh-8ZJmrpFojN8F2uxyOQXEBoeSAJvhiVsvsVuvfXca6U5Kup3UsaBMU-vo5gH_gBCAsqPdI6BpPXtp1F7fBaksS_RFgEFb1IMWs7fKHORjUTdTzm8FmA_uhYQK2q7zXj2R1MSszMqTc7wnAJABHZw-HItOL8AzVBUG39yO2NnvitqXRJWrrv3JohHh&wd=&eqid=95880f450000d468000000055e85a6e6

《vs报错未加载wntdll.pdb,ntdll.dll0xC0000374: 堆已损坏》(https://blog.youkuaiyun.com/luoye2333/article/details/89087530

开始调试

调试之后发现是在调用CUDA方法之后导致的内存错误,致使程序结束时销毁对象时发生错误。

检查CUDA调用函数

cudaError_t supplementPix(uchar *c, const uchar *a, const uchar *b, unsigned int size){
    cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
    cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
    cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
    cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
    cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
    cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
}

发现是在修改模板代码时候,将int改为uchar,改漏了sizeof(int)


解决方案

修改之后,运行结果(成功)



综述

当程序返回值为 exited with code -1073740940 、调式错误提示0xc0000374 ntdll.dll堆已损坏 时候说明是内存泄漏问题,

尤其是由此导致程序结束时销毁对象(即release())时的错误


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值