5

这是我的代码:

#include <stdio.h>
#include <CL/cl.h>
#include <CL/cl_platform.h>

int main(){    
    cl_float3 f3 =  (cl_float3){1, 1, 1};
    cl_float3 f31 = (cl_float3) {2, 2, 2};
    cl_float3 f32 = (cl_float3) {2, 2, 2};
    f3 = f31 + f32;
    printf("%g %g %g \n", f3.x, f3.y, f3.z);
    return  0;
}

使用 gcc 4.6 编译时,会产生错误

test.c:14:11: error: invalid operands to binary + (have ‘cl_float3’ and ‘cl_float3’)

对我来说很奇怪,因为OpenCL 规范在第 6.4 节中证明了这一点,增加了两个floatn. 我需要包含任何其他标题吗?

但更奇怪的是,在编译时-std=c99出现错误,例如

test.c:16:26: error: ‘cl_float3’ has no member named ‘x’

..对于所有组件(x、y 和 z)...

4

3 回答 3

6

结构下标编译问题的原因可以在AMD SDK中标准的实现中看出。

如果您查看<CL/cl_platform.h>AMD 工具包中的标头,您可以看到结构是如何定义的。

 typedef  cl_float4  cl_float3;

 typedef union
 {
    cl_float  CL_ALIGNED(16) s[4];
 #if (defined( __GNUC__) ||  defined( __IBMC__ )) && ! defined( __STRICT_ANSI__ )
   __extension__ struct{ cl_float   x, y, z, w; };
 ....
 #endif
 }cl_float4;

#if当使用 调用 gcc 时,该子句将被忽略--std=c99

要使您的代码与 --std=c99 一起使用,您可以替换对f3.xwithf3.s[0]等的引用。

于 2012-06-11T14:02:02.457 回答
5

OpenCL 程序由两部分组成。

  1. 在主机上运行的程序。这通常是用 C 或 C++ 编写的,但它没有什么特别之处,只是它使用了 OpenCL 规范第 4 和第 5 节中描述的 API。
  2. 在 OpenCL 设备(通常是 GPU)上运行的内核。这是用第 6 节中指定的语言编写的。这不是 C,但它很接近。它添加了诸如矢量操作之类的东西(就像您尝试使用的那样)。这是由主机程序编译的,它通过 API 将包含内核代码的字符串传递给 OpenCL。

您混淆了两者,并试图在主机代码中使用内核语言的特性。

于 2012-06-11T12:51:22.730 回答
2
于 2017-03-22T09:27:07.370 回答