2011-04-19 3 views
1

장치에 생성 된 데이터 (A [i, j, k])의 큰 덩어리가 있지만 A [i, :, :]의 하나의 '슬라이스'만 필요하며 일반 CUDA에서는 일부 포인터 연산으로 쉽게 수행 할 수 있습니다.PyCUDA 메모리 주소 지정 : 메모리 오프셋?

pycuda 내에서 동일한 작업을 수행 할 수 있습니까? 즉

cuda.memcpy_dtoh(h_iA,d_A+(i*stride)) 

는 분명히 이것은합니다 (이명 령 모양에서 유추하지 않는 한) 어떤 크기 정보를 theres 이후 완전히 잘못이지만, 희망 당신은 아이디어를 얻을?

답변

2

pyCUDA gpuArray 클래스는 1D 배열의 분할을 지원하지만 보폭을 필요로하는 더 높은 차원은 지원하지 않습니다 (오고 있지만). 그러나 gpuarray 멤버 (pycuda.driver.DeviceAllocation 유형) 및 gpuArray.dtype.itemsize 멤버의 크기 정보에서 다차원 gpuArray의 기본 포인터에 액세스 할 수 있습니다. 그런 다음 memcpy 드라이버 함수가 받아 들일 수있는 것을 얻기 위해 염두에두고 있던 것과 같은 종류의 포인터 연산을 할 수 있습니다.

그것은 매우 pythonic 아니지만 작동하지 않습니다 (또는 내가 작년에 많은 pyCUDA + MPI 해킹을 할 때 적어도 그랬습니다).

0

PyCuda에서 구현되는 것은 거의 없습니다. 메모리에

  1. 복사 전체 배열 과 관심 슬라이스에서 NumPy와 배열합니다

    나는 다음과 같은 해결책을 생각할 수 있습니다.

  2. 매트릭스를 읽고 원하는 슬라이스를 만드는 커널을 만듭니다.
  3. 포인터 산술에서 한 번에 조각을 읽을 수있는 방식으로 생성 된 데이터를 재정렬하십시오.
+0

어쨌든 옵션 1로 갔지만 다른 사람에게 우리가 생각하지 못했던 마법의 해결책이 있는지보기 위해 몇 시간 동안 질문을 열어 두었습니다. – Bolster

+0

예, 1 주일 이상 지났습니다. 모두가 그렇게 매일 읽을 수 있습니다 :) – fabrizioM