2012-09-12 7 views
0

Java로 작성된 프로그램에서 GPU 계산을 구현 중입니다. 그 목적을 위해 나는 jcuda 바인딩을 사용하고 있습니다. 때로는 상대적으로 큰 배열의 장치 메모리 전송에 빠른 호스트가 필요합니다. 스트림을 사용하려면 고정 된 메모리를 사용해야합니다. 문제는 내가 호스트의 고정 된 메모리를 cca 600 MB보다 큰 RAM에 할당하려는 경우 "CUDA_ERROR_OUT_OF_MEMORY"예외가 발생합니다.Java와 함께 CUDA를 사용하는 큰 고정 메모리 덩어리 할당

public static void main(String[] args) { 
    //Init GPU 
    JCudaDriver.setExceptionsEnabled(true); 

    // Initialize the device and create device context 
    cuInit(0); 
    CUdevice device = new CUdevice(); 
    cuDeviceGet(device, 0); 
    CUcontext context = new CUcontext(); 
    cuCtxCreate(context, 0, device); 

    Pointer p = new Pointer(); 

    int Kb = 1024; 
    int Mb = 1024 * Kb; 
    int Gb = 1024 * Mb; 
    int sequenceSize = 172*Mb; // times 4 for float 
    float[] expecteds = new float[sequenceSize]; 
    float[] actuals = new float[sequenceSize]; 
    Arrays.fill(expecteds, 3.33f); 
    int i = 0; 
    try { 
     JCudaDriver.cuMemAllocHost(p, sequenceSize* Sizeof.FLOAT); 
     FloatBuffer fb = p.getByteBuffer(0, sequenceSize* Sizeof.FLOAT). 
       order(ByteOrder.nativeOrder()). 
       asFloatBuffer(); 

     fb.position(0); 
     fb.put(expecteds); 
     fb.position(0); 
     fb.get(actuals); 
     JCudaDriver.cuMemFreeHost(p); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     JCudaDriver.cuMemFreeHost(p); 
    } 

} 

지금, 나는 OS가 비 페이징 이후 내가 너무 많은 고정 된 메모리를 사용하는 것을 방지 할 수 있음을 알고 있어요 : 이것은 내가 사용할 수있는 고정 된 메모리의 크기를 테스트하는 데 사용되는 코드입니다. 문제는 내가 48Gb (45Gb 무료)의 실제 메모리를 가지고 있으며 OS에 더 많은 것을 제공 할 수있는 방법이 필요하다는 것입니다. 가능한 한 우아하게 이것을 할 수있는 방법이 있습니까?

편집 : OS가 64 비트 윈도우 7 프로페셔널 SP1 64 비트 모드에서 자바를 실행하는

+0

장치의 메모리가 아닌 주 메모리를 사용하고 있습니까? –

+0

문제의 OS는 무엇입니까? – talonmies

+0

글쎄, [cuMemAllocHost()] (http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__MEM_gdd8311286d2c2691605362c689bc64e0.html) 함수는 호스트 메모리를 할당하는 데 사용되며, 예를 들어 나는 장치 메모리를 건드리지 않았다. OS는 현재 64 비트 Windows 7 Professional SP1에 있습니다. –

답변

1

확인을합니다. FAQ은 64 비트 다운로드가 있더라도 default is 32-bit을 제안합니다. 링크 된 FAQ는 또한 64 비트 모드에서 실행하는 방법을 알려주며, 64 비트 DLL 등을 사용해야합니다.

@ ArchaeSoftware가 제안한 cuMemHostRegister()/을 사용하면 메모리의 작은 부분을 고정 할 수 있습니다.

0

이전 페이지에 있지만 답변이없는 것 같습니다. 기본적으로 Java가 자체적으로 힙을위한 많은 메모리를 할당하지 않기 때문에 RAM을 올바르게 사용하지 않는 것으로 보입니다. JVM이 -Xms 및 -Xmx로 최소 및 최대 메모리를 사용하게하고 64 비트 아키텍처에서 작업 할 때 "-Xms"또는 "-Xmx"뒤에 "-d64"를 사용하십시오