如何使用jCuda 中的函数pointer.to(int[ ]) 来索引一维“结果”数组。我想将一 block 数据写入“Result”的前 n 个位置,并将下一个数据 block 写入 Result[0 + chunk],依此类推。
与 C 不同,我不能说 Result+chunk 并继续生活。那么我如何索引到中间位置?
最佳答案
假设您从 jcuda.org 引用 JCuda:
当您使用 Pointer#to(int[]) 创建指向 int 数组的指针时,您可以使用 Pointer#withByteOffset(long) 创建具有特定字节偏移量的指针方法。所以在这个例子中:
Pointer p = Pointer.to(intArray);
Pointer next = p.withByteOffset(chunkSize * Sizeof.INT);
此方法仅在数组中的特定位置创建“ View ”。它不复制任何数据等。结果指针将仅指向数组的第“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), ...);
关于java - jCuda 指针函数中的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20603893/