如何解决OpenCl无法使用'printf'编译内核
尝试构建OpenCL内核时出现错误error: implicit declaration of function 'printf' is invalid in OpenCL
。内核代码是这个
__kernel void conj_grad(int dim,int num_vals,__local float *r,__local float *x,__local float* A_times_p,__local float *p,__global int *rows,__global int *cols,__global float *A,__global float *b,__global float *result) {
local float alpha,r_length,old_r_dot_r,new_r_dot_r;
local int iteration;
int id = get_local_id(0);
int start_index = -1;
int end_index = -1;
float Ap_dot_p;
printf("OpenCL Kernel ID: %d\n",id);
这给我下面的错误
input.cl:14:4: error: implicit declaration of function 'printf' is invalid in OpenCL
input.cl:14:4: note: did you mean 'rint'?
/usr/include/clc/math/unary_decl.inc:1:39: note: 'rint' declared here
/usr/include/clc/math/rint.h:2:24: note: expanded from macro '__CLC_FUNCTION'
input.cl:46:45: warning: double precision constant requires cl_khr_fp64,casting to single precision
此函数err = clBuildProgram(program,NULL,NULL);
的返回码为负
我已经尝试过Using printf() in OpenCL kernel和printf function doesn't work in OpenCL kernel这些问题的解决方案,但这些解决方案都无法解决。当我尝试这些解决方案时,会看到诸如input.cl:1:26: warning: unknown OpenCL extension 'cl_amd_printf' - ignoring
结论
好像我的系统不支持printf扩展。下面的代码(从pmdj的答案中窃取)给出了以下输出。看起来像是一个经典故事,它不依赖于供应商对标准的特定扩展。
#include <stdio.h>
#include <CL/cl.h>
int main(void) {
char ext_str[1024] = "";
size_t ext_str_len = sizeof(ext_str) - 1;
cl_device_id device_id;
cl_int err;
cl_platform_id platform;
err = clGetPlatformIDs(1,&platform,NULL);
if(err < 0) {
perror("Couldn't identify a platform");
exit(1);
}
err = clGetDeviceIDs(platform,CL_DEVICE_TYPE_GPU,1,&device_id,NULL);
if(err < 0) {
perror("Couldn't access any devices");
exit(1);
}
err = clGetDeviceInfo(device_id,CL_DEVICE_EXTENSIONS,sizeof(ext_str),ext_str,&ext_str_len);
if(err < 0) {
perror("Couldn't get device info");
exit(1);
}
printf("CL extensions (%lu): '%s'\n",ext_str_len,ext_str);
return 0;
}
CL extensions (248): 'cl_khr_byte_addressable_store cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_fp64 cl_khr_fp16'
解决方法
您已经发现printf
不是标准OpenCL的一部分,但是某些实现提供了启用它的扩展。
要检查实现支持的扩展,请尝试如下操作:
char ext_str[1024] = "";
size_t ext_str_len = sizeof(ext_str) - 1;
err = clGetDeviceInfo(device_id,CL_DEVICE_EXTENSIONS,sizeof(ext_str),ext_str,&ext_str_len);
printf("CL extensions (%lu): '%s'\n",ext_str_len,ext_str);
如果没有列出任何cl_*_printf
扩展名,那么您可能不走运。如果列出了一个,则需要按照链接的其他答案中的说明启用它。您可能还需要检查您支持的特定扩展的规格,以防它表现出任何特殊的怪癖。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。