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 비트 모드에서 자바를 실행하는
장치의 메모리가 아닌 주 메모리를 사용하고 있습니까? –
문제의 OS는 무엇입니까? – talonmies
글쎄, [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에 있습니다. –