0

如何使用 jCuda 中的函数 pointer.to(int[ ]) 在一个索引中,比如说一维“结果”数组。我想将一大块数据写入“Result”的前 n 个位置,然后将下一块数据写入 Result[0 + chunk],依此类推。

与 C 不同,我不能说 Result+chunk 并继续生活。那么我如何索引到中间位置呢?

4

1 回答 1

2

假设您从 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), ...);
于 2014-01-10T16:57:06.950 回答