【发布时间】:2020-09-19 23:32:05
【问题描述】:
我在尝试构建 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, 0, NULL, NULL, 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'
【问题讨论】:
-
OpenCL 不支持
printf。一些实现支持它作为扩展,其他实现可能不支持。从内核打印通常没有多大意义。