gpt4 book ai didi

opencl - 如何为 OpenCL 结构数组设置正确的对齐方式?

转载 作者:行者123 更新时间:2023-12-04 02:52:35 25 4
gpt4 key购买 nike

我有以下结构:

C++:

struct ss{
cl_float3 pos;
cl_float value;
cl_bool moved;
cl_bool nextMoved;
cl_int movePriority;
cl_int nextMovePriority;
cl_float value2;
cl_float value3;
cl_int neighbors[6];
cl_float3 offsets[6];
cl_float off1[6];
cl_float off2[6];
};

OpenCL:

typedef struct{
float3 nextPos;
float value;
bool moved;
bool nextMoved;
int movePriority;
int nextMovePriority;
float value2;
float value3;
int neighbors[6];
float3 offsets[6];
float off1[6];
float off2[6];
} ss;

我有一个数组,我将它们传递给 opencl 缓冲区,但是当我在内核中操作它们时,数据被破坏了。

我相信这是因为对齐,我已经阅读了其他关于它的帖子

I need help understanding data alignment in OpenCL's buffers

Aligning for Memory Accesses in OpenCL/CUDA

但是,我仍然不完全了解如何正确设置与我的结构的对齐方式。另外,我不完全理解 attribute aligned and packed qualifiers。

所以:

Q1。你能告诉我如何调整我的结构以正常工作吗?

Q2。您能否解释一下或给我一些链接以了解所有对齐问题和限定符?

谢谢。

最佳答案

我建议先从最宽的类型到最窄的类型声明您的结构。首先,这避免了由于对齐而浪费未使用的空间。其次,这通常可以避免因在不同设备上进行不同对齐而带来的任何麻烦。

所以,

struct ss{
cl_float3 pos;
cl_float3 offsets[6];
cl_float value;
cl_float value2;
cl_float value3;
cl_float off1[6];
cl_float off2[6];
cl_int movePriority;
cl_int nextMovePriority;
cl_int neighbors[6];
cl_bool moved;
cl_bool nextMoved;
};

此外,请注意 float3 类型;它通常是 GPU 上的 float4,如果主机端布局也不这样做,那么您的对齐方式就会关闭。您可以切换到 float4 来避免这种情况。

关于opencl - 如何为 OpenCL 结构数组设置正确的对齐方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17361274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com