Pointers Cuda:使用全局内存存储连续的各种大小的数据

Pointers Cuda:使用全局内存存储连续的各种大小的数据,pointers,memory-management,cuda,gpgpu,Pointers,Memory Management,Cuda,Gpgpu,我在全局内存中使用字节缓冲区来存储不同大小的整数(8位、16位、32位、64位)时遇到问题 如果我将一个整数存储在指针值为4字节的非倍数处(例如,因为我刚刚存储了一个8位整数),则地址将向下舍入,从而删除以前的数据 __global__ void kernel(char* pointer) { *(int*)(pointer+3)=3300000; } 在这个示例代码中,考虑到指针是4的倍数,使用:(指针),(指针+1),(指针+2),(指针+3)中的任意一个,整数存储在(指针) cu

我在全局内存中使用字节缓冲区来存储不同大小的整数(8位、16位、32位、64位)时遇到问题

如果我将一个整数存储在指针值为4字节的非倍数处(例如,因为我刚刚存储了一个8位整数),则地址将向下舍入,从而删除以前的数据

__global__ void kernel(char* pointer)
{
    *(int*)(pointer+3)=3300000;
}
在这个示例代码中,考虑到指针是4的倍数,使用:(指针),(指针+1),(指针+2),(指针+3)中的任意一个,整数存储在(指针)

cuda内存是否在硬件级别组织在32位块中?
有什么办法可以做到这一点吗?

字号对齐在CUDA中是不可协商的。但是,如果出于某种原因您愿意承受性能损失,您可以将数据打包到char*中,然后编写自己的自定义存储函数,例如

__inline __device__ void Assign(int val, char * arr, int len)
{
   for (int idx = 0; idx < len; idx++)
      *(arr+idx)=(val & (0xFF<<(idx<<8))
}

__inline __device__ int Get(char * arr, int idx, int len)
{
   int val;
   for (int idx = 0; idx < len; idx++)
      val=(int)(*arr[idx+len*idx]<<(idx<<8)));
   return val;
}
\uuuuuu内联\uuuuu设备\uuuuuuuu无效分配(int-val,char*arr,int-len)
{
for(int-idx=0;idx*(arr+idx)=(val&(0xFF字长对齐在CUDA中是不可协商的。但是,如果您出于某种原因愿意承受性能损失,您可以将数据打包到char*中,然后只编写自己的自定义存储函数,例如

__inline __device__ void Assign(int val, char * arr, int len)
{
   for (int idx = 0; idx < len; idx++)
      *(arr+idx)=(val & (0xFF<<(idx<<8))
}

__inline __device__ int Get(char * arr, int idx, int len)
{
   int val;
   for (int idx = 0; idx < len; idx++)
      val=(int)(*arr[idx+len*idx]<<(idx<<8)));
   return val;
}
\uuuuuu内联\uuuuu设备\uuuuuuuu无效分配(int-val,char*arr,int-len)
{
for(int-idx=0;idx*(arr+idx)=(val&(0xFF为什么不直接使用
int
指针,让编译器决定最佳对齐方式?你知道,数百名专家设计的这项技术能够尽可能最好地与硬件配合使用?因为我必须存储各种大小的数据:char、int、long-long int等。在我的项目中,我不能使用int指针并丢失数据每次我需要存储一个字符时,需要24位内存。(等效代码在C中工作得非常好,所以我似乎是Cuda专用代码)。Cuda需要字大小的对齐。这是不可协商的。您不能将非32位对齐的地址强制转换为32位类型。除了某些硬件不允许中断对齐之外(最多包括硬件陷阱和崩溃),如果你在x86这样一个更宽松的硬件上强制执行类似的操作,那么你很可能会受到巨大的性能影响,因此即使这样做可行,它也很可能会破坏你从GPU硬件中获得的任何好处。好的,谢谢你们的评论,它们非常有用。我承认这不是一个gre在idea,但在本例中,我非常关注内存使用优化。无论如何,我会设法使我的代码适应此约束!为什么不使用
int
指针,让编译器决定最佳对齐方式?你知道,数百名专家设计的这项技术尽可能最好地与硬件配合使用?Bec因为我必须存储各种大小的数据:char、int、long-long-int等。在我的项目中,我不能使用int指针,每次需要存储一个char时都会丢失24位内存。(等效代码在C中工作得非常好,所以我似乎是Cuda专用代码).Cuda需要字大小的对齐。这是不可协商的。您不能将非32位对齐的地址强制转换为32位类型。此外,某些硬件不允许断开对齐(最多包括硬件陷阱和崩溃),如果你在x86这样一个更宽松的硬件上强制执行类似的操作,那么你很可能会受到巨大的性能影响,因此即使这样做可行,它也很可能会破坏你从GPU硬件中获得的任何好处。好的,谢谢你们的评论,它们非常有用。我承认这不是一个gre在idea,但在本例中,我非常关注内存使用优化。无论如何,我将设法使我的代码适应此约束条件!谢谢,这很有帮助!我将尝试您的解决方案,为我的应用程序找到性能和内存使用优化之间的最佳折衷。谢谢,这很有帮助!我将尝试您的解决方案,以找到最佳解决方案为我的应用程序优化性能和内存使用之间的最佳权衡。