【发布时间】:2017-08-22 05:17:08
【问题描述】:
我面临的问题是,如果我将 CUDA 堆大小设置为我需要在内核中分配的总内存量,那么堆仍然不足以满足所有分配。
这是一个代表我的用例的最小示例:
#include <stdio.h>
#define NARR 8
__global__
void heaptest(int N){
double* arr[NARR];
__shared__ double* arrS[NARR];
if(threadIdx.x == 0){
for(int i = 0; i < NARR; i++){
arrS[i] = (double*) malloc(sizeof(double) * N);
if(arrS[i] == NULL)
printf("block %d, array %d is NULL\n", blockIdx.x, i);
}
}
__syncthreads();
for(int i = 0; i < NARR; i++){
arr[i] = arrS[i];
}
}
size_t getHeapSizePerBlock(int N){
return sizeof(double) * N * NARR;
}
int main(){
int N = 4000 * 18;
int nBlocks = 1;
size_t myheapsize = getHeapSizePerBlock(N) * nBlocks;
printf("set heap size to %lu\n", myheapsize);
cudaDeviceSetLimit(cudaLimitMallocHeapSize, myheapsize);
size_t a;
cudaDeviceGetLimit(&a, cudaLimitMallocHeapSize);
printf("heap size is now %lu\n", a);
heaptest<<<nBlocks, 128>>>(N);
cudaDeviceSynchronize();
cudaDeviceReset();
return 0;
}
我用 nvcc V8.0.61 编译。
nvcc -arch=sm_60 heaptest.cu -o heaptest
程序输出是
set heap size to 4608000
heap size is now 4653056
block 0, array 7 is NULL
因此,即使堆大小大于所需大小,也不够大。 在这种情况下如何正确计算所需的尺寸?
【问题讨论】:
-
你能用 pow 2 size 试试吗
N = 4096*32 -
@dari 我尝试在 [1, 4096] 中使用 N = n * 32 表示 n。它适用于 n
-
你在哪个 GPU 上运行?
标签: cuda