避免OpenCL中的数据对齐

避免OpenCL中的数据对齐,opencl,Opencl,我需要将一个复杂的数据类型作为缓冲区传递给OpenCL,并且我希望(如果可能的话)避免缓冲区对齐 在OpenCL中,我需要使用两种结构来区分在缓冲区转换中传递给它们的数据: typedef struct { char a; float2 position; } s1; typedef struct { char a; float2 position; char b; } s2; 我这样定义内核: __kernel void Foo( __global c

我需要将一个复杂的数据类型作为缓冲区传递给OpenCL,并且我希望(如果可能的话)避免缓冲区对齐

在OpenCL中,我需要使用两种结构来区分在缓冲区转换中传递给它们的数据:

typedef struct
{
   char a;
   float2 position;
} s1;

typedef struct
{
   char a;
   float2 position;
   char b;
} s2;
我这样定义内核:

__kernel void 
Foo(
   __global const void* bufferData,
   const int amountElements // in the buffer
)
{
   // Now I cast to one of the structs depending on an extra value
   __global s1* x = (__global s1*)bufferData;

}
只有当我对齐在缓冲区中传递的数据时,它才能正常工作


问题是:有没有一种方法可以使用\u attribute((压缩))\u attribute((对齐的(1))来避免在缓冲区中传递的数据对齐?

如果不能填充较小的结构,我建议传递另一个参数,让您的内核函数知道类型是什么——可能只是元素的大小

由于您有9字节和10字节的数据类型,因此可能值得尝试将它们填充到12字节,这取决于您在内核中读取了多少字节

您可能还感兴趣的是扩展:cl_khr_byte_addressable_store

更新: 我不知道你通过的是一个混合数组,我认为它的类型是一致的。如果要基于每个元素跟踪类型,则应传递类型(或代码)列表。在bufferData中单独使用float2可能也会更快

__kernel void 
Foo(
   __global const float2* bufferData,
   __global const char* bufferTypes,
   const int amountElements // in the buffer
)

您好@mfa,您确定填充不是选项吗?因为我真正需要在缓冲区中传递的是一个具有两种不同类型节点的树,所以工作会有点困难。我在每个节点中传递一个字节,指示它是什么类型的节点。你到底想做什么?我在上面用另一个建议进行了更新。我试图向GPU内存发送一个树,但我试图避免内存填充,因为我必须在OpenCL中设计缓冲区和程序时非常小心,但是如果必须填充,那么我必须这样做。我在考虑创建一个算法来进行填充。我必须传递一个float3,所以如果我以float2的形式传递它,那么OpenCL的代码就会变得不清晰,所以我更喜欢填充,并且有一个清晰的OpenCL代码。谢谢你的帮助