gpt4 book ai didi

memory - 当我知道有足够的内存空间时,为什么cudaMalloc给我一个错误?

转载 作者:行者123 更新时间:2023-12-04 17:11:57 24 4
gpt4 key购买 nike

我有一个Tesla C2070,应该具有5636554752字节的内存。

但是,这给了我一个错误:

int *buf_d = NULL;

err = cudaMalloc((void **)&buf_d, 1000000000*sizeof(int));

if( err != cudaSuccess)
{
printf("CUDA error: %s\n", cudaGetErrorString(err));
return EXIT_ERROR;
}

这怎么可能?这与最大存储间距有关吗?以下是GPU的规范:
Device 0: "Tesla C2070" 
CUDA Driver Version: 3.20
CUDA Runtime Version: 3.20
CUDA Capability Major/Minor version number: 2.0
Total amount of global memory: 5636554752 bytes
Multiprocessors x Cores/MP = Cores: 14 (MP) x 32 (Cores/MP) = 448 (Cores)
Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 32768 Warp size: 32
Maximum number of threads per block: 1024
Maximum sizes of each dimension of a block: 1024 x 1024 x 64
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1
Maximum memory pitch: 2147483647 bytes

至于我正在运行的机器,它有24个英特尔®至强®处理器X565,以及Linux发行版Rocks 5.4(Maverick)。

有任何想法吗?谢谢!

最佳答案

基本问题在于您的问题标题-您实际上不知道自己是否有足够的内存力,但前提是您假设自己有。运行时API包括cudaMemGetInfo函数,该函数将返回设备上的可用内存量。在设备上建立上下文后,驱动程序必须为设备代码,每个线程的本地内存,用于printf支持的fifo缓冲区,每个线程的堆栈以及内核内malloc/new调用的堆保留空间(有关更多信息,请参见this answer)细节)。所有这些都会消耗相当多的内存,使您的代码保留ECC保留后的可用内存量远远少于最大可用内存。该API还包括cudaDeviceGetLimit,可用于查询设备运行时支持消耗的内存量。还有一个伴随调用cudaDeviceSetLimit,它可以允许您更改运行时支持的每个组件将保留的内存量。

即使在您根据自己的喜好调整了运行时内存占用量并从驱动程序获得了实际的可用内存值之后,仍然需要解决页面大小的粒度和碎片问题。很少有可能分配API将免费报告的每个字节。通常,当目标是尝试分配卡上的每个可用字节时,我会执行以下操作:

const size_t Mb = 1<<20; // Assuming a 1Mb page size here

size_t available, total;
cudaMemGetInfo(&available, &total);

int *buf_d = 0;
size_t nwords = total / sizeof(int);
size_t words_per_Mb = Mb / sizeof(int);

while(cudaMalloc((void**)&buf_d, nwords * sizeof(int)) == cudaErrorMemoryAllocation)
{
nwords -= words_per_Mb;
if( nwords < words_per_Mb)
{
// signal no free memory
break;
}
}

// leaves int buf_d[nwords] on the device or signals no free memory

(请注意,不要在编译器附近,只有在CUDA 3或更高版本上才是安全的)。隐式假定没有任何大分配问题的明显原因在这里适用(32位主机操作系统,未启用TCC模式的WDDM Windows平台,较旧的已知驱动程序问题)。

关于memory - 当我知道有足够的内存空间时,为什么cudaMalloc给我一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905949/

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