OpenCL 将 float3 主机发送到设备

zud*_*aha 2 opencl

我无法将一些数据发送到我的设备。

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

typedef struct{uint3 nbCells;
    float3 worldOrigin;
    float3 cellSize;
    float3 gridSize;
    float  radius;
} grid_t;
Run Code Online (Sandbox Code Playgroud)

我从主机发送的数据类型是:

typedef struct{
    uint nbCells[3];
    float worldOrigin[3];
    float cellSize[3];
    float gridSize[3];
    float radius; 
} grid_t;
Run Code Online (Sandbox Code Playgroud)

但效果不佳。

我发送:

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
Run Code Online (Sandbox Code Playgroud)

但在我的内核中,我收到了:

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
Run Code Online (Sandbox Code Playgroud)

我知道 float3 实际上在 Opencl 中被认为类似于 float4,所以我尝试使用 float4 和 4 个浮点数组,但它也不起作用。我尝试使用 3 个浮点数组而不是 float3 来接收数据,并且它工作得很好。它似乎在 opencl 中,由 3 个浮点数组成的结构没有与 3 个浮点数数组相同的内存大小。并且具有相同的结构,但使用 double 而不是 float,效果很好。

Dar*_*ros 5

永远不要尝试将 CL 类型与非 CL 类型匹配。除非你真的知道它们确实匹配。

如果这是您的内核类型:

typedef struct{
   uint3 nbCells; 
   float3 worldOrigin; 
   float3 cellSize; 
   float3 gridSize; 
   float radius; 
} grid_t;
Run Code Online (Sandbox Code Playgroud)

这应该是您的主机类型:

typedef struct{ 
   cl_uint3 nbCells; 
   cl_float3 worldOrigin; 
   cl_float3 cellSize; 
   cl_float3 gridSize; 
   cl_float radius; 
} grid_t;
Run Code Online (Sandbox Code Playgroud)

这就是在主机端定义的 cl 数据类型的用例(当您包含 cl.h 时)。

您的错误来自使用 float3 类型(与 float4 相同),并使用float[3]代替float[4].