OpenCl无法使用';printf';
我得到一个错误:当我试图构建OpenCL内核时,函数“printf”的隐式声明在OpenCL中无效。内核代码如下OpenCl无法使用';printf';,opencl,amd,Opencl,Amd,我得到一个错误:当我试图构建OpenCL内核时,函数“printf”的隐式声明在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, __glo
__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)得到一个负返回码代码>
我已经尝试过这些问题的解决方案,但这两种解决方案都没有解决它。当我尝试这些解决方案时,我看到一个警告,例如input.cl:1:26:warning:unknown OpenCL扩展'cl\u amd\u printf'-忽略
结论
看起来我的系统不支持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;
}
正如您所发现的,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_*\u printf
扩展,那么您可能运气不好。如果列出了一个答案,则需要按照链接的其他答案中所述启用它。您可能还需要检查您所支持的特定扩展的规范,以防它表现出任何特殊的怪癖。这有帮助吗?OpenCL不支持printf
。一些实现支持将其作为扩展,其他实现可能不支持。从内核打印通常没有多大意义。这当然更准确。你建议我删除我的吗?@APJo老实说,我不认为你的回答有什么特别有用的地方,但这当然取决于你。感谢你的诚实,我会删除我的,我不想给出不好的答案:)@APJo听起来很明智。我试图肯定人们在这个网站上的贡献,但回答你从未使用过的技术问题通常是没有帮助的,至少在没有深入研究的情况下是没有帮助的。公平地说,提问者可能错误地将问题标记为c
标记,这可能会让你认为这是关于常规c代码的。(FWIW,我偶尔会尝试回答一些我不知道确切答案的问题-这是一种很好的学习方式-所以不要气馁。有时会有效果,我可以帮助和学习,有时我发现我自己太深了。)谢谢你的帮助!支持的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);