функция перераспределения растущей памяти в cuda

0

Я ищу функцию для перераспределения массива CUDA (device-), если данные перерастут контейнер. фон - это редкие данные, которые я храню в массивах, которые я начинаю с 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 израсходованы. Если используется более половины из них, я хочу сделать массив больше. Я использую эту функцию для этого:

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);
        (...)
    {
{

ядро copy выглядит следующим образом:

__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 и бесплатный (не CUDA), который, казалось, работал. Однако это приводит к сбою моей программы, с намеком на доступ к памяти вне пределов. Я почти уверен, что мне не хватает какой-либо справочной/де-справочной информации, но не могу найти, где именно проблема. любые указания на то, почему это не удается?

  • 2
    Вам, вероятно, нужно показать весь соответствующий код. Например, запуск 1-D сетки из 2-D потоковых блоков кажется странным. Вы, конечно, можете это сделать, но это вызывает вопросы о том, как вы вычисляете индексирование в вашем copy_kernel которое вы не показали. Если вы ссылаетесь на адрес устройства за пределами допустимого диапазона, было бы хорошо показать код устройства. Можете ли вы быть более откровенным по поводу "сделать мой сбой программы"? Означает ли это ошибку сегмента или что-то еще? Вы пробовали cuda-memcheck ? Пожалуйста, покажите полное приложение, которое кто-то другой может скомпилировать и запустить. Да, это требует усилий.
  • 0
    Вот моя попытка построить код вокруг того, что вы показали ( grow_array и memory_manager ). Кажется, работает правильно. Если вам нужна помощь, приведите полный пример, как я это сделал. Голосование, чтобы закрыть.
Показать ещё 6 комментариев
Теги:
arrays
cuda

1 ответ

1
Лучший ответ

код, заменяющий указатели новыми, большими указателями, по-видимому, не был причиной ошибки за пределами границ, хотя это и вызвало это. Обнаружена ошибка в неродственном ядре и зафиксирована. Спасибо всем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню