가 jcuda.org에서 JCuda에 다스된다고 가정. 따라서이 예에서 :
Pointer p = Pointer.to(intArray);
Pointer next = p.withByteOffset(chunkSize * Sizeof.INT);
이 방법은 배열의 특정 위치에 "보기"만 만듭니다. 데이터를 복사하지 않습니다. 결과 포인터는 배열의 'chunkSize'번째 요소를 가리키게됩니다. 따라서, C 구조의 "자바 버전"입니다. 언급 한 귀하는 귀하가 말한 C 구조의 "Java 버전"입니다.
int *p = ...
int *next = p + chunkSize;
중요 : 의도 한 오프셋에 배열의 요소 크기를 실제로 곱해야합니다! BYTE 오프셋이어야하므로 int [] 배열의 올바른 위치를 가리 키기 위해 'chunkSize'에 Sizeof.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);
}
같은 도우미 메서드 증가 할 수있다