复制没有memcpy的字节

时间:2017-03-16 01:27:21

标签: c opencl memcpy

我有几个存储在char数组中的不同类型的变量。通常我会以这种方式将它们写入数组:

public SelectionListener menuSelectionListener = new SelectionListener() {

        @Override
        public void widgetSelected(SelectionEvent arg0) {
                Stream<ToolsetAvailability> resourceAvail = scenarioMap.get("5-Year Mar. 2016 1. Single Source").availabilityData.parallelStream().filter(availability -> availability.resourceID.equals("3004"));
                System.out.println("resourceAvail count:"+resourceAvail.count());
}

但是,memcpy在OpenCL内核中不起作用。没有这个功能,最简单的方法是什么?

3 个答案:

答案 0 :(得分:3)

循环怎么样?

int a;
unsigned char * p = (unsigned char *)&a;
for (int i = 0; i != sizeof(int); ++i) offset[i] = p[i];

答案 1 :(得分:2)

您可以轻松提供mymemcpy

  void mymemcpy(unsigned char *dest, const unsigned char *src, size_t N)
  {
     size_t i;

     for(i=0;i<N;i++)
       dest[i] = src[i];
  }

然而,它效率不高,因为大多数副本都是4或8字节倍数的对齐副本。如果你可以计算出对齐是8个字节,那么以unsigned long long为单位进行复制。有时甚至值得填充缓冲区以使其达到8个字节的倍数。

答案 2 :(得分:2)

对于char类型,可以使用vload和vstore命令仅1-16个字节,对于int类型,可以使用4-64个字节,对于long类型,可以使用8-128个字节。这可能是有利的或不利的,这取决于总核心数量。内存访问模式。

我没有检查但是这应该触发编译器使用快速sse avx加载并存储在cpu上并使用完整的总线宽度用于gpu。还满足对齐条件,因为它是对加载存储的未对齐访问的uhdesinde行为。

您需要先复制数组的非对齐头部。如果有的话。