すでにJavaで書かれたプログラムにGPU計算を実装しています。その目的のために、私はjcudaバインディングを使用しています。場合によっては、比較的大きなアレイのデバイスへの高速なホストメモリ転送が必要です。ストリームを使用する場合は、固定メモリを使用する必要があります。問題は、cca 600 MbsのRAMを超えるホストに固定されたメモリを割り当てたい場合、「CUDA_ERROR_OUT_OF_MEMORY」例外が発生することです。これは、使用可能な固定メモリのサイズをテストするために使用したコードです。
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ビットのWindows 7ProfessionalSP1です