假设我想对一个大型固定对象执行并行计算,例如一个固定的大型稀疏(有向)图,或任何类似类型的对象。
要对此图或对象进行任何合理的计算,例如图中的随机游走,出于速度原因,将图放在全局内存中可能是不可能的。
这留下了本地/私人内存。如果我对 GPU 架构的理解正确,那么(只读)访问本地或私有内存之间几乎没有速度差异,对吗?我不愿意将图形复制到私有内存,因为这意味着每个工作单元都必须存储整个图形,这可能会很快耗尽 GPU 的内存(对于非常大的图形,甚至会减少可以使用和/或使操作系统不稳定)。
所以,假设我在本地与私有的读取速度上是正确的,我该如何在实践中做到这一点?如果例如为了简化我将图简化为 anint[] from
和 an int[] to
(存储每个有向边的开始和结束),我当然可以使内核看起来像这样
computeMe(__local const int *to, __local const int *from, __global int *result) {
//...
}
但我不知道我应该如何从 JOCL 调用它,因为那里没有给出私有/本地/全局修饰符。
局部变量会自动写入每个本地工作组的内存吗?或者这是如何工作的?我完全不清楚我应该如何正确地进行内存分配。