OpenCL中的结构数组中的动态数组

时间:2018-06-21 11:26:03

标签: c++ opencl

我有一个结构体:

struct A
{
double a;
int c;
double *array;
}
main()
{
A *str = new A[50];
for(int i=0;i<50;i++)
{
str[i].array = new double[5];
str[i].array[0] = 50;
}
.....
Buffer BufA = Buffer(...,..., 50 * sizeof(A),str);
.....
}

在内核中

struct A
{
double a;
int c;
double *array;
}

__kernel void vector(__global A *str)
{
int id = get_global_id(0);
printf("Element - %f",str[id].array[0]);
}

但是在内核中看不到数组中的值。可能是因为我在缓冲区中为结构数组分配了内存,而没有动态数组的内存。我该如何实施?

2 个答案:

答案 0 :(得分:3)

在现代系统上,进程看不到对象的实际地址,而是看到virtual addresses的对象。

这意味着,两个进程不能互相传递指针,并且期望它们表示同一件事。您需要牢记这一点来重新考虑您的应用程序。

答案 1 :(得分:1)

YSC 提到的地址虚拟化之上,您还应该记住,图形卡(或其他OCL设备)所运行的内存可能不同(例如,不同件硬件)从CPU所运行的内存中获取。

OpenCL缓冲区负责在这些内存之间传输其内容。因此,例如,您在CPU上创建并写入的int数组必须复制到GPU内存(并在其中分配空间,并且有可能在内核完成后复制回去),这些缓冲区为您服务。但是,如果在缓冲区中存储指向 other CPU的指针,则该 not 不会自动转移其他内存。此外,指针关系很可能会中断,因为不能保证您的其他数据在GPU内存中的位置与在CPU内存中的位置相同。

自然,解决方案是将要传输的所有数据放入缓冲区(包括子数组)中。一种不使用过多缓冲区的方法是将子数组打包在一起,然后将索引存储到其中,而不是指向内存的指针。