Форум программистов, компьютерный форум, киберфорум
CUDA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233

Ошибка памяти при запуске на больших данных

13.01.2018, 19:44. Показов 2756. Ответов 6

Студворк — интернет-сервис помощи студентам
Имеется следующий код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
 
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <windows.h>
#include <math.h>
 
#define SIZE_BASE_ARR (int)pow((double)2,(double)14)
#define SIZE_LOOK_ARR (int)pow((double)2,(double)20)
 
#define THREADS_IN_BLOCK (int)pow((double)2,(double)9)
#define BLOCKS_IN_GRID (int)pow((double)2,(double)11)
 
#define gpuErrchk(ans) {gpuAssert((ans), __FILE__, __LINE__);}
void gpuAssert(cudaError_t code, const char *file, int line, bool abort = true)
{
    if (code != cudaSuccess) {
        fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
        //if (abort) exit(code);
    }
}
__global__ void searchElements(float *lookForArr, float *baseArr, float *resultsArr)
{
    int lookForArrId = threadIdx.x + blockDim.x * blockIdx.x;
    int i = 0;
 
    if (lookForArrId < SIZE_LOOK_ARR) {
        for (i = 0; i < SIZE_BASE_ARR; i++) 
            if (baseArr[i] == lookForArr[lookForArrId])
                resultsArr[lookForArrId]++;
    }
}
void initArrs (float *arr, int size)
{
    int i = 0;
    for (i = 0; i < size; i++)
        arr[i] = 1;
}
int main()
{
    float *baseArr = NULL, *lookForArr = NULL, *resultArr = NULL;
    float *baseArrDev = NULL, *lookForArrDev = NULL, *resultArrDev = NULL;
    int i = 0;
 
    baseArr = (float*)malloc(SIZE_BASE_ARR * sizeof(float));
    lookForArr = (float*)malloc(SIZE_LOOK_ARR * sizeof(float));
    resultArr = (float*)malloc(SIZE_LOOK_ARR * sizeof(float));
 
    initArrs(baseArr, SIZE_BASE_ARR); initArrs(lookForArr, SIZE_LOOK_ARR);
    memset(resultArr, 0, SIZE_LOOK_ARR * sizeof(float));
 
 
    cudaMalloc( (void**) &baseArrDev, SIZE_BASE_ARR * sizeof(float));
    cudaMalloc( (void**) &lookForArrDev, SIZE_LOOK_ARR * sizeof(float));
    cudaMalloc( (void**) &resultArrDev, SIZE_LOOK_ARR * sizeof(float));
 
    gpuErrchk( cudaMemcpy(baseArrDev, baseArr, SIZE_BASE_ARR * sizeof(float), cudaMemcpyHostToDevice));
    gpuErrchk( cudaMemcpy(lookForArrDev, lookForArr, SIZE_LOOK_ARR * sizeof(float), cudaMemcpyHostToDevice));
    gpuErrchk( cudaMemcpy(resultArrDev, resultArr, SIZE_LOOK_ARR * sizeof(float), cudaMemcpyHostToDevice));
 
    dim3 threads = dim3(THREADS_IN_BLOCK);
    dim3 blocks = dim3(BLOCKS_IN_GRID);
 
    searchElements<<<blocks, threads>>> (lookForArrDev, baseArrDev, resultArrDev);
    gpuErrchk( cudaPeekAtLastError() );
    gpuErrchk( cudaDeviceSynchronize() );
    gpuErrchk( cudaMemcpy(resultArr, resultArrDev, SIZE_LOOK_ARR * sizeof(float), cudaMemcpyDeviceToHost) );
 
    cudaFree(baseArrDev); cudaFree(lookForArrDev); cudaFree(resultArrDev);
 
    for (i = 0; i < SIZE_LOOK_ARR; i++)
        if (resultArr[i] != SIZE_BASE_ARR) {
            printf("Error\n");
            break;
        }
    printf("Press any key...");
    getchar();
    return 0;
}
суть его сводится к тому, чтобы посмотреть, сколько раз элемент из массива lookForArr встретился в массиве baseArr. Результат встречаемости для каждого элемента записывается в resultArr. По идее, в итоге у меня каждый элемент массива resultArr должен равняться 2^14, но выскакивают две ошибки после выполнения ядра:

GPUassert: unspecified launch failure D:/CUDA_TRAIN/C_vector_add/kernel.cu 69
GPUassert: unspecified launch failure D:/CUDA_TRAIN/C_vector_add/kernel.cu 70


Что-то связано с памятью, но не могу понять, в чём проблема.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2018, 19:44
Ответы с готовыми решениями:

Ошибка в памяти при запуске программы
Доброго времени суток! в общем...контрольная по паскалю, задачка, вроде как написал, вроде как работает, но не могу победить ошибку...

Ошибка EDataBaseError при запуске базы данных
Project Project1.exe raised exception class EDataBaseError with message 'A component named PrimaryKey already exists'. Process stopped. Use...

Ошибка при запуске базы данных Access
Всем доброго времени суток! Уважаемые форумчане, подскажите пожалуйста в чём может быть проблема: при открытии базы данных Access (формат...

6
20 / 19 / 7
Регистрация: 31.01.2016
Сообщений: 79
13.01.2018, 21:48
Я ловил такую ошибку,когда функция выполнялась длительное время.Если всё это на ОС Windows,то там есть принудительная перезагрузка драйвера видеокарты,если она долго не реагирует на запросы системы,и программа будет как раз выпадать с такой ошибкой.Лечить можно так:

Запускаем редактор реестра, раскрываем ветку HKLM\System\CurrentControlSet\Control\Gr aphicsDrivers , и ищем там два ключа –TdrLevel и TdrDelay (если их там нет- а их скорее всего нет-то их нужно создать, тип REG_DWORD , не забудьте «десятичная система счисления» при редактировании параметра; значения описаны ниже). TdrLevel –собственно настройка восстановления. Стандартно имеет значение «3», соответствующее состоянию „TdrLevelRecover – Recover on timeout”, т.е. „восстановление по тайм-ауту”. Выставляем значение „0”, соответствующее „TdrLevelOff – Detection disabled”, т.е. „детектирование отключено”. TdrDelay –установка времени задержки , т.е. реагирования на „безответность” драйвера. Стандартное значение –„2”, это время в секундах. Выставляем от 3 и больше, можно выявить необходимую задержку опытным путём, или сразу ввести, например,”10”. Полагаю, понятно, что в случае, если TdrLevel выставлен в «отключено», изменять время задержки (TdrDelay) смысле уже нет. Я бы рекомендовал начинать с увеличения времени вместо отключения-всё-таки сама по себе система восстановления вполне заслуживает того, чтобы жить, и может действительно спасти вам не сохраненные данные в случае проблем с драйвером и необходимости экстренной перезагрузки. После внесения изменений не забываем перезагружать компьютер, ключи реестра дадут эффект только после рестарта системы. Небольшая оговорка – этот способ поможет, если проблема с драйвером действительно лежит только в плоскости программного решения, и если для восстановления работоспособности драйвера не нужен «пинок», рестарт его. В других случаях – выключение этого параметра может привести к зависанию компьютера на момент, когда такая ситуация должна проявиться, так же, как это было на XP. Если после использования этого решения компьютер стал зависать там, где раньше выскакивало сообщение – то этоn вариант решения не для вас.
1
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
13.01.2018, 22:22  [ТС]
Tassadar_, спасибо за полный ответ. Сейчас буду пробовать. Выставил для TdrLevel 0, TdrDelay 5 для начала. Посмотрим, что даст.

Добавлено через 21 минуту
Tassadar_, так, к сожалению, на этих параметрах возникло обычное зависание, как Вы и говорили. Если выставить TdrLevel 3, то те же самые ошибки вылетают. Я так понимаю, лучше всего на линуксе писать?
0
20 / 19 / 7
Регистрация: 31.01.2016
Сообщений: 79
13.01.2018, 22:43
Я для своих задач выставлял TdrDelay на 120 секунд.Попробуйте TdrDelay секунд на 20 поставить,если не поможет - на 40-60.
0
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
13.01.2018, 23:15  [ТС]
Tassadar_, а можете по-подробнее написать, на что влияет этот параметр и вообще почему так долго выполняется казалось бы "не долгий" код?

Значение сейчас изменю.

Добавлено через 14 минут
Tassadar_, и дополнение к вопросу: как понять, что время выставлено верно и программа отработает? Есть ли какие-нибудь визуальные признаки?

Добавлено через 7 минут
Tassadar_, поставил TdrDelay 20 - программа отработала корректно. Но вопрос про критерий остаётся в силе и ещё: а если вычислений будет ещё больше? Неужели надо выставлять TdrDelay ещё больше? Более элегантное решение у этого есть?
0
20 / 19 / 7
Регистрация: 31.01.2016
Сообщений: 79
14.01.2018, 00:18
Насколько я понимаю,этот параметр влияет на время,в течение которого система не реагирует,если видеокарта не отвечает на запросы системы.Пока видеокарта занята расчётами,она как раз не реагирует на запросы системы.

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

Если задача слишком тяжёлая для видеокарты,то я вижу только один вариант - дробить её на более мелкие части,с которыми видеокарта может справиться,и запускать их.
0
14 / 14 / 13
Регистрация: 05.07.2011
Сообщений: 233
14.01.2018, 14:31  [ТС]
Tassadar_, понял Вас. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2018, 14:31
Помогаю со студенческими работами здесь

Ошибка "Повреждены управляющие блоки памяти" при запуске игры
Здравствуйте! Помогите мне!!! Установил я игру Русская Рыбалка Подмосковье. При запуске игры вылезла ошибка «7» (Повреждены...

Ошибка при запуске программы с базой данных в Delphi 2010
Здравствуйте! При запуске программы с базой данных вылетает ошибка http://www.imagepost.ru/?v=855/1.JPG Код здесь: procedure...

ESET NOD 32 Smart Security 7 при запуске выдаёт "Ошибка при обмене данных с ядром"
Здавствуйте. Примерно 2-3 дня назад мой антивирус стал выдавать ошибку &quot;Ошибка при обмене данных с ядром&quot;. Так же очень долго...

Ошибка при освобождении памяти (block type is valid) и неправильный вывод структуры данных
Доброго времени суток. У меня есть класс вектор для реализации длинной арифметики. Возникли проблемы с умножением. Я устроил эту...

Проблемы при запуске компа из-за оперативной памяти !
Доброго время суток всем. Я далеко не последний пользователь компютера, так как уже давно учусь в даной сфере и очень во много разбираюсь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru