我有一个结构体:
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]);
}
但是在内核中看不到数组中的值。可能是因为我在缓冲区中为结构数组分配了内存,而没有动态数组的内存。我该如何实施?
答案 0 :(得分:3)
在现代系统上,进程看不到对象的实际地址,而是看到virtual addresses的对象。
这意味着,两个进程不能互相传递指针,并且期望它们表示同一件事。您需要牢记这一点来重新考虑您的应用程序。
答案 1 :(得分:1)
在 YSC 提到的地址虚拟化之上,您还应该记住,图形卡(或其他OCL设备)所运行的内存可能不同(例如,不同件硬件)从CPU所运行的内存中获取。
OpenCL缓冲区负责在这些内存之间传输其内容。因此,例如,您在CPU上创建并写入的int
数组必须复制到GPU内存(并在其中分配空间,并且有可能在内核完成后复制回去),这些缓冲区为您服务。但是,如果在缓冲区中存储指向 other CPU的指针,则该 not 不会自动转移其他内存。此外,指针关系很可能会中断,因为不能保证您的其他数据在GPU内存中的位置与在CPU内存中的位置相同。
自然,解决方案是将要传输的所有数据放入缓冲区(包括子数组)中。一种不使用过多缓冲区的方法是将子数组打包在一起,然后将索引存储到其中,而不是指向内存的指针。