gpt4 book ai didi

java - 使用 CUDA 和 Java 分配大固定内存块

转载 作者:行者123 更新时间:2023-12-01 15:10:52 25 4
gpt4 key购买 nike

我正在用 Java 编写的程序中实现 GPU 计算。为此,我使用 jcuda绑定(bind)。有时,我需要对相对较大的数组进行快速的主机到设备内存传输。如果我想使用流,我必须使用固定内存。问题是,如果我想分配大于 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);
}

}

现在,我知道操作系统可以阻止我使用过多的固定内存,因为它是不可分页的。问题是我有 48Gb(45Gb 空闲)物理内存,我需要一种方法强制操作系统给我更多的物理内存。有没有办法做到这一点(如果可能的话,优雅地)?

编辑:操作系统是 64 位 Windows 7 Professional SP1

最佳答案

检查您是否在 64 位模式下运行 Java。 FAQ建议default is 32-bit ,即使是 64 位下载。链接的常见问题解答还告诉您如何在 64 位模式下运行,您还需要使用 64 位 DLL 等。

@ArchaeSoftware 建议使用 cuMemHostRegister()/cuMemHostUnregister() 来固定较小的内存部分,这是一个明智的选择。

关于java - 使用 CUDA 和 Java 分配大固定内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12386708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com