我是 CUDA/C 的新手,也是堆栈溢出的新手。这是我的第一个问题。
我试图在内核函数中动态分配内存,但结果出乎意料。
我读到在内核中使用 malloc() 会大大降低性能,但无论如何我都需要它,所以我首先尝试使用一个简单的int **
array 只是为了测试可能性,那么我实际上需要分配更复杂的结构。
在我的主要我用过cudaMalloc()
为数组分配空间int *
,然后我用了malloc()
对于内核函数中的每个线程,为外部数组的每个索引分配数组。然后我使用另一个线程来检查结果,但它并不总是有效。
这是主要代码:
#define N_CELLE 1024*2
#define L_CELLE 512
extern "C" {
int main(int argc, char **argv) {
int *result = (int *)malloc(sizeof(int));
int *d_result;
int size_numbers = N_CELLE * sizeof(int *);
int **d_numbers;
cudaMalloc((void **)&d_numbers, size_numbers);
cudaMalloc((void **)&d_result, sizeof(int *));
kernel_one<<<2, 1024>>>(d_numbers);
cudaDeviceSynchronize();
kernel_two<<<1, 1>>>(d_numbers, d_result);
cudaMemcpy(result, d_result, sizeof(int), cudaMemcpyDeviceToHost);
printf("%d\n", *result);
cudaFree(d_numbers);
cudaFree(d_result);
free(result);
}
}
I used extern "C"
因为我在导入标头时无法编译,而本示例代码中未使用该标头。我粘贴它是因为我不知道这是否相关。
这是 kernel_one 代码:
__global__ void kernel_one(int **d_numbers) {
int i = threadIdx.x + blockIdx.x * blockDim.x;
d_numbers[i] = (int *)malloc(L_CELLE*sizeof(int));
for(int j=0; j<L_CELLE;j++)
d_numbers[i][j] = 1;
}
这是 kernel_two 代码:
__global__ void kernel_two(int **d_numbers, int *d_result) {
int temp = 0;
for(int i=0; i<N_CELLE; i++) {
for(int j=0; j<L_CELLE;j++)
temp += d_numbers[i][j];
}
*d_result = temp;
}
一切工作正常(又名计数是正确的),直到我在设备内存中使用的总块数少于 1024*2*512。例如,如果我#define N_CELLE 1024*4
程序开始给出“随机”结果,例如负数。
知道问题出在哪里吗?
谢谢任何人!