我有问题将一些数据发送到我的设备。
我想在内核中接收的数据类型是:
typedef struct{uint3 nbCells;
float3 worldOrigin;
float3 cellSize;
float3 gridSize;
float radius;
} grid_t;
我从主机发送的数据类型是:
typedef struct{
uint nbCells[3];
float worldOrigin[3];
float cellSize[3];
float gridSize[3];
float radius;
} grid_t;
但它没有奏效。
我发送:
8, 8, 8; 0, 0, 0; 1.03368e-06, 1.03368e-06, 1.03368e-06; 8.2694e-06, 8.2694e-06, 8.2694e-06; 3e-07
但在我的内核中我得到了:
8, 8, 8; 0, 0 1.03368e-06; 1.03368e-06, 8.2694e-06, 8.2694e-06; 3e-07, 8.2694e-06, 0; 1.16428e-05
我知道float3在Opencl中实际上被认为是float4,所以我尝试使用float4和4 float的数组,但它也没有用。我尝试使用3 float而不是float3的数组接收数据,它完美地工作。在opencl中,它似乎是一个由3个浮点数组成的结构,其内存大小与3个浮点数相同。 并且具有相同的结构,但是使用double而不是float,它可以完美地工作。
答案 0 :(得分:4)
您永远不应该尝试将CL类型与非CL类型匹配。除非你确实知道他们确实匹配。
如果这是你的内核类型:
typedef struct{
uint3 nbCells;
float3 worldOrigin;
float3 cellSize;
float3 gridSize;
float radius;
} grid_t;
这应该是您的主机类型:
typedef struct{
cl_uint3 nbCells;
cl_float3 worldOrigin;
cl_float3 cellSize;
cl_float3 gridSize;
cl_float radius;
} grid_t;
这是主机端定义的cl数据类型的用例(当你包含cl.h时)。
您的错误来自于使用float3类型(与float4相同),并使用float[3]
而不是float[4]
模拟该类型。