gpt4 book ai didi

c++ - 在cuda中重新分配不断增长的内存的功能

转载 作者:行者123 更新时间:2023-11-28 07:05:33 24 4
gpt4 key购买 nike

<分区>

我正在寻找一个函数来重新分配 CUDA(设备)数组,如果数据超出它的容器。背景是稀疏数据,我将其保存在我从 0 开始并慢慢开始填充的数组中。

我开始分配一个给定的数字开始:

在 main() 中:

int number_of_blocks = 30;
int dyn_cells = number_of_blocks * (BLOCK_WIDTH-4) * (BLOCK_HEIGHT-4);
HANDLE_ERROR(cudaMalloc(&h_dev, dyn_cells * sizeof(float)));

然后我做了一些计算,h_dev 中越来越多的 block 被用完了。如果使用了一半以上,我想让数组更大。我使用这个函数来做到这一点:

void grow_array(float **ptr, int length, int length_new)
{
float *ptr_new;
int width = length_new * (BLOCK_WIDTH - 4);
int height= (BLOCK_HEIGHT- 4);
HANDLE_ERROR(cudaMalloc(&ptr_new , width * height * sizeof(float)));
//this is the copy kernel
dim3 threads(BLOCK_WIDTH-4,BLOCK_HEIGHT-4);
dim3 blocks(length_new);
copy_kernel<<<blocks,threads>>>(*ptr,ptr_new, length, length_new);

float *old_ptr;
old_ptr = *ptr;
HANDLE_ERROR( cudaFree( old_ptr ) );
*ptr = ptr_new;
}

我这样调用它:

void memory_manager(int &blocks_available, int blocks_used, float** h_dev)
{
double ratio = (double)blocks_used/(double)blocks_available;
if (ratio > 0.5)
{
int new_length = 1.5 * blocks_available;
grow_array(h_dev , blocks_available, new_length);
(...)
{
{

复制内核如下所示:

__global__ void copy_kernel(float* old_vector, float* new_vector, int old_size, int new_size)
{
int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = threadIdx.y;
int offset_new = x + y * new_size * (BLOCK_WIDTH-4);
int offset_old = x + y * old_size * (BLOCK_WIDTH-4);
if (blockIdx.x < old_size)
{
new_vector[offset_new] = old_vector[offset_old];
}
else
{
new_vector[offset_new] = 42.0f;
}
}

我最初是在使用 malloc 和 free(非 CUDA)的原型(prototype)之后写的,这似乎可以工作。然而,这使我的程序崩溃,提示越界内存访问。我很确定我遗漏了一些引用/取消引用问题,但找不到问题的确切位置。任何关于为什么失败的指示?

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