よく理解できないメモリ割り当ての問題があります。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
を割り当てるだけ686MB
で、メモリ不足エラーが発生します。しかし、RAMが4GB以上空いています。
次に、割り当てを試行する場合、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 をさらに 6 GB (合計 8 GB) に解放したのに、ホストの割り当てがまだ失敗していることです。4GB を malloc しようとすると、正常に動作します。