在jCuda指针函数中建立索引

时间:2013-12-16 05:12:38

标签: java pointers jcuda

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

与C不同,我不能说结果+大块并继续生活。我如何索引到中间位置呢?

1 个答案:

答案 0 :(得分:2)

假设您从jcuda.org引用JCuda:

使用Pointer#to(int[])创建指向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), ...);