【发布时间】:2014-08-18 12:07:26
【问题描述】:
我在一个文件中确实有一个结构,它包含在主机代码和内核中
typedef struct {
float x, y, z,
dir_x, dir_y, dir_z;
int radius;
} WorklistStruct;
我正在我的 c++ 主机代码中构建这个结构,并通过缓冲区将它传递给 OpenCL 内核。
如果我选择一个 CPU 设备进行计算,我会得到以下结果:
printf ( "item:[%f,%f,%f][%f,%f,%f]%d,%d\n", item.x, item.y, item.z, item.dir_x, item.dir_y,
item.dir_z , item.radius ,sizeof(float));
主持人:
item:[20.169043,7.000000,34.933712][0.000000,-3.000000,0.000000]1,4
设备(CPU):
item:[20.169043,7.000000,34.933712][0.000000,-3.000000,0.000000]1,4
如果我选择 GPU 设备 (AMD) 进行计算,就会发生奇怪的事情:
主持人:
item:[58.406261,57.786015,58.137501][2.000000,2.000000,2.000000]2,4
设备(GPU):
item:[58.406261,2.000000,0.000000][0.000000,0.000000,0.000000]0,0
值得注意的是 sizeof(float) 在 gpu 上是垃圾。
我认为浮动在不同设备上的布局存在问题。
注意:该结构包含在此类型的结构数组中,该数组中的每个结构在 GPU 上都是垃圾
任何人都知道为什么会出现这种情况以及我如何预测这种情况?
编辑我在 and 处添加了一个 %d 并将其替换为 1,结果为:1065353216
编辑:这里有两个我正在使用的结构
typedef struct {
float x, y, z,//base coordinates
dir_x, dir_y, dir_z;//directio
int radius;//radius
} WorklistStruct;
typedef struct {
float base_x, base_y, base_z; //base point
float radius;//radius
float dir_x, dir_y, dir_z; //initial direction
} ReturnStruct;
我测试了一些其他的东西,它看起来像是 printf 的问题。价值观似乎是正确的。我将参数传递给返回结构,读取它们并且这些值是正确的。
我不想发布所有相关代码,这将是几百行。 如果没有人知道我会压缩一下。
啊,对于打印,我使用的是#pragma OPENCL EXTENSION cl_amd_printf : enable。
编辑: 看起来真的像 printf 的问题。我只是不再使用它了。
【问题讨论】:
-
%d不是打印sizeof结果的合适格式。对于符合 C99 的编译器,它应该是%zu。 -
从混合中移除缓冲传输;只需填写结构值并尝试首先让 printf 工作。为了证明 sizeof(float) 是 4,在 else 之前和之后添加一个它的条件 == 4 和一个 printf 以查看采用哪条路径。
-
你能展示一下包含在内核和主机端代码以及内存对象创建和读/写代码中的标头吗?
标签: c++ c floating-point opencl gpu