【问题标题】:Dynamic array in an array of structures in OpenCLOpenCL中结构数组中的动态数组
【发布时间】:2018-06-21 20:41:40
【问题描述】:

我有一个结构:

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]);
}

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

【问题讨论】:

  • C 和 C++ 不是同一种语言。由于您的 sn-p 中有 new,因此我删除了 C 标签。下次不要用它来回答 C++ 问题。

标签: c++ opencl


【解决方案1】:

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

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

【讨论】:

  • 你能把这个问题详细解释一下吗,我不明白你,如果对你来说不难吗?
  • 不,我刚开始了解这些东西,很难理解许多设计。能给个链接吗?
  • @Fresto 我们来玩个游戏吧。我在我的答案中隐藏了一个链接。试着找到它。 (是的,它一直都在那里)
  • 我不喜欢它的渲染方式,很容易错过。
【解决方案2】:

除了 YSC 提到的地址虚拟化之外,您还应该记住,您的显卡(或其他 OCL 设备)正在运行的内存可能是不同的(例如,不同的硬件)从您的 CPU 正在运行的内存中提取。

OpenCL 缓冲区负责在这些内存之间传输其内容。因此,例如,您在 CPU 上创建和写入的 ints 数组必须被复制到 GPU 内存(并在那里分配空间,并且可能在内核完成后复制回来),这些缓冲区会这样做为你。但是,如果您将指向 other CPU 内存的指针存储在缓冲区中,那么其他内存将不会自动传输。此外,指针关系很可能会中断,因为无法保证您的其他数据在 GPU 内存中与 CPU 内存中的位置相同。

解决方案自然是将所有要传输的数据放入缓冲区,包括子数组。在不使用过多缓冲区的情况下执行此操作的一种方法是将子数组打包成一个,并将索引存储在其中而不是指向内存的指针。

【讨论】:

  • 现在我至少明白了变量和指针的传递有什么区别。太感谢了。另外,我正在考虑制作一个巨大的数组,将由每个核心共享
  • 如果我在结构中指定一个固定长度的数组。是否可以在结构中传输数组?它也不起作用
  • 我认为拥有double array[5]; 成员应该可以正常工作。缓冲区几乎可以肯定memcpy 您的数据,并且由于固定大小数组的数据直接在结构中,我看不出有问题。但如果你不能让它发挥作用,你可能应该问一个新问题。
  • 你能看到这个问题吗? stackoverflow.com/questions/50970079/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
相关资源
最近更新 更多