2013-12-16 30 views
0

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

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

回答

1

假设你从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版本”。您提到的是C构造的“Java版本”

int *p = ... 
int *next = p + chunkSize; 

重要提示:请务必将预期偏移乘以数组中元素的大小!它必须是BYTE偏移量,所以'chunkSize'必须乘以Sizeof.INT才能真正指向int []数组中的正确位置。 (在C语言中,这种乘法是基于指针类型隐含地完成的,但由于Java中的指针没有关联类型,所以您必须指定BYTE偏移量)

提示:当您经常需要这种偏移指针

// C version: 
cudaMemcpy(p + chunkSize * i, ...); 

// Java version: 
cudaMemcpy(at(p, chunkSize * i), ...); 
:特定类型的,可读性可与这样的

private static Pointer at(Pointer p, int offsetInInts) 
{ 
    int offsetInBytes = offsetInInts * Sizeof.INT; 
    return p.withByteOffset(offsetInBytes); 
} 

一个辅助方法,你可以在方法调用中使用增加