OpenCl无法使用';printf';

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

我得到一个错误:当我试图构建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, __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);