我有几个存储在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内核中不起作用。没有这个功能,最简单的方法是什么?
答案 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行为。
您需要先复制数组的非对齐头部。如果有的话。