OpenCL将float3主机发送到设备

时间:2015-03-06 17:18:28

标签: opencl

我有问题将一些数据发送到我的设备。

我想在内核中接收的数据类型是:

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,它可以完美地工作。

1 个答案:

答案 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]模拟该类型。