2013-12-16 6 views
0

jCuda에서 pointer.to (int []) 함수를 사용하여 하나의 인덱스에 어떻게 1D "결과"배열을 만들 수 있습니까? "Result"의 첫 번째 n 위치와 Result [0 + chunk] 이후의 데이터의 다음 덩어리에 데이터 덩어리를 쓰고 싶습니다.jCuda에서 인덱싱 포인터 함수

C와는 달리, 나는 결과 + 청크를 말할 수없고 삶을 살아갈 수 없다. 어떻게하면 중간 위치에 색인을 붙일 수 있습니까? 만약 Pointer#to(int[])를 사용 int 배열에 대한 포인터를 생성

, 당신은 Pointer#withByteOffset(long) 방법을 이용하여 오프셋을 특정 바이트에 대한 포인터를 생성 할 수

답변

1

가 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); 
} 

같은 도우미 메서드 증가 할 수있다