如何正确设置cuda-memcheck(compute-sanitizer)的--filter选项
cuda-memcheck racecheck 单Kernel过滤配置方法
--filter选项的官方文档描述中,{key1=val1}[{,key2=val2}]格式里的key1/key2和外层方括号都是格式占位标记,不是实际需要输入的内容。按Kernel名称过滤时固定使用预定义键kns(kernel name substring的缩写),对应值为目标Kernel的名称子串,整个参数串不能加多余空格、括号,也不能拆分键值对。
常见写法错误
- 误将文档里的
key1/key2占位符当作实际参数名写入 - 逗号前后加空格,导致参数被Shell拆分为独立片段,触发无效选项报错
- 误将标记可选内容的方括号当作参数内容输入
- 直接把Kernel名放在
--filter后,没有指定对应的过滤键
正确命令格式
cuda-memcheck --tool racecheck --filter kns=<目标Kernel名称> <可执行文件路径> [可执行文件启动参数]
使用示例
假设待检测Kernel名为vec_add_kernel,编译出的可执行文件为./my_cuda_app,程序运行需要传入参数./input.dat,完整检测命令为:
cuda-memcheck --tool racecheck --filter kns=vec_add_kernel ./my_cuda_app ./input.dat
使用注意事项
kns采用子串匹配规则,不需要输入CUDA编译器自动生成的Kernel完整修饰名(包括前缀标记、模板参数后缀等),只要传入的子串能唯一匹配目标Kernel即可;如果项目中存在同名Kernel,可以传入更长的特征子串避免误匹配- 过滤规则生效后,racecheck仅会对匹配到的Kernel插桩做竞态检测,其余Kernel直接跳过执行,检测速度相比全量开启racecheck有数量级提升,适配大体量CUDA项目的单Kernel调试需求
- 如果需要叠加其他过滤规则(比如按所属源码模块、Kernel启动配置过滤),直接在filter参数后用无空格的逗号拼接键值对即可,例如同时限定Kernel所属源码文件为
vec_ops.cu时,参数写法为--filter kns=vec_add_kernel,mod=vec_ops.cu - 除了已经配置的
-Xcompiler -lineinfo参数,建议编译时加上-Xcompiler -rdynamic,可以让racecheck输出的报错栈、行号信息更完整准确
内容的提问来源于stack exchange,提问作者Samiran K
相关产品推荐
相关产品推荐

