OpenCL中__kernel与HashCat的KERNEL_FQ区别及编译问题咨询
关于HashCat中KERNEL_FQ宏的疑问及编译错误解决
问题背景
在HashCat项目的OpenCL文件中,内核函数采用如下方式定义:
KERNEL_FQ void m20600_comp (KERN_ATTR_TMPS (omt_sha256_tmp_t)) { ... }
我只见过用__kernel定义OpenCL内核函数,有以下疑问:
- KERNEL_FQ是不是
__kernel的合法替代? - 如果不是,它到底是什么?
- 使用Clang为AMD编译该内核时出现错误:
kernel-test.cl:138:1: error: unknown type name 'KERNEL_FQ',执行的命令为:
clang -Dcl_clang_storage_class_specifiers -isystem libclc/generic/include -include clc/clc.h -target polaris11-amdgcn-- -xcl kernel-test.cl -emit-llvm -S -o kernel-test.ll
解答
KERNEL_FQ的本质
KERNEL_FQ不是OpenCL标准中的合法关键字,它是HashCat项目自定义的预处理宏。宏的作用
这个宏是HashCat为实现跨OpenCL编译环境的兼容性而定义的,在预处理阶段会被展开为标准的__kernel关键字(或根据编译目标平台调整为适配的定义),用于统一不同环境下的内核声明方式。编译错误的原因与解决
出现unknown type name 'KERNEL_FQ'错误,是因为你的编译命令没有引入HashCat项目中定义该宏的头文件,导致Clang无法识别这个自定义宏。
解决办法:
- 在编译命令中添加HashCat项目的头文件路径(比如HashCat源码根目录下的
inc/目录),确保预处理阶段能找到定义KERNEL_FQ的头文件。 - 参考HashCat原生的编译脚本(如Makefile)中的参数,复用必要的宏定义和头文件路径,保证编译环境与HashCat项目一致。
示例修正后的编译命令(假设HashCat头文件位于hashcat/inc目录):
clang -Dcl_clang_storage_class_specifiers -isystem libclc/generic/include -include clc/clc.h -I hashcat/inc -target polaris11-amdgcn-- -xcl kernel-test.cl -emit-llvm -S -o kernel-test.ll
内容的提问来源于stack exchange,提问作者Amrit Baveja
相关产品推荐
相关产品推荐

