如何使用 jCuda 中的函数 pointer.to(int[ ]) 在一个索引中,比如说一维“结果”数组。我想将一大块数据写入“Result”的前 n 个位置,然后将下一块数据写入 Result[0 + chunk],依此类推。
与 C 不同,我不能说 Result+chunk 并继续生活。那么我如何索引到中间位置呢?
假设您从 jcuda.org 引用 JCuda:
当您使用创建指向 int 数组的指针时Pointer#to(int[])
,您可以使用该方法创建具有特定字节偏移量的指针Pointer#withByteOffset(long)
。所以在这个例子中:
Pointer p = Pointer.to(intArray);
Pointer next = p.withByteOffset(chunkSize * Sizeof.INT);
此方法仅在数组中的特定位置上创建一个“视图”。它不会复制任何数据。结果指针将仅指向数组的第 'chunkSize' 元素。因此,它是 C 构造的“Java 版本”
int *p = ...
int *next = p + chunkSize;
你提到的。
重要提示:确保将预期的偏移量乘以数组中元素的大小!它必须是 BYTE 偏移量,因此必须乘以“chunkSize”Sizeof.INT
才能真正指向 int[] 数组中的正确位置。(在 C 中,这种乘法是基于指针类型隐式完成的。但由于 Java 中的指针没有关联类型,因此您始终必须指定 BYTE 偏移量)
提示:当你经常需要特定类型的偏移指针时,可以使用这样的辅助方法来增加可读性
private static Pointer at(Pointer p, int offsetInInts)
{
int offsetInBytes = offsetInInts * Sizeof.INT;
return p.withByteOffset(offsetInBytes);
}
您可以在方法调用中使用:
// C version:
cudaMemcpy(p + chunkSize * i, ...);
// Java version:
cudaMemcpy(at(p, chunkSize * i), ...);