我有一个我不太明白的内存分配问题。我正在尝试分配相当大的 GPU 内存块(我猜这可能是内存碎片问题?)
我非常简化的代码是:
#include <stdio.h>
#include <cuda.h>
int main()
{
CUcontext ctx;
CUdevice dev = 0;
void *toSpace;
CUdeviceptr ptr = (CUdeviceptr)NULL;
int status;
int size = 1280*1024*1024;
status = cuInit(0);
printf("status: %i\n",status);
status = cuCtxCreate(&ctx, 0, dev);
printf("status: %i\n",status);
status = cuMemHostAlloc(&toSpace, size, 0);
printf("status: %i\n",status);
status = cuMemAlloc(&ptr, size);
printf("status: %i\n",status);
status = cuCtxDestroy(ctx);
printf("status: %i\n",status);
printf("\nPress any key to exit...");
char c;
scanf("%c", &c);
return 0;
}
编辑:
cuMemHostAlloc
只让我 allocate 686MB
,我得到内存错误。但我有超过 4GB 的可用 RAM。
然后,如果我尝试分配 GPU 内存,cuMemAlloc
我也想分配最多1279MB
. 但根据我拥有的设备信息2048MB
,这些信息1981MB
是免费的。
如果这是一个碎片问题,是否有办法找到我可以分配的最大内存块?
设备信息是
Version: 2.1
Name: GeForce GT 525M
Total global memory: 1981/2047 (Free/Total) MBytes
Total registers per block: 32768
Warp size: 32
Maximum memory pitch: 2147483647
Maximum threads per block: 1024
Total shared memory per block 49152 Bytes
Clock rate: 1 MHz
Memory Clock rate: 900000
Total constant memory: 65536
Integrated: 0
Max threads per multiprocessor:1536
Number of multiprocessors: 2
Maximum dimension x of block: 1024
Maximum dimension y of block: 1024
Maximum dimension z of block: 64
Maximum dimension x of grid: 65535
Maximum dimension y of grid: 65535
Maximum dimension z of grid: 65535
更新:
因此,在处理了很多 GPU 内存分配之后,我相信这是主机分配出错了。
问题是我现在将更多的 RAM 释放到 6GB(总共 8GB)并且主机分配仍然失败。如果我尝试 malloc 4GB 虽然它工作正常。