Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
1

Битовые утечки при записи данных на диск

06.06.2016, 14:42. Показов 5654. Ответов 119
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня форумчане!
Сорри если оффтоп но... Пишу в консольке на C++ (MSVCE 2010) различные движки по расчетам и тут столкнулся с опасной проблемой.
При записи на диск искажаются данные на один бит, где то один раз на 109 - 1011 данных. Бит просто "теряется" (был 1 стал 0 или наоборот) , соответственно данные уже не верны, что приводит к нулю все проделанную работу.
Из исследованного:
Бит теряется при записи как в поток текстового значения переменных (типа fileout << a[i] << endl;)
Так и при записи в двоичном виде (типа fileout.write(reinterpret_cast<char*>(a),size*sizeof(a[0]));)
Замечено, что данные в памяти верные, т.к. были пойманы моменты при повторном выводе из того же массива все данные были записаны корректно.
Ошибка не зависит от винчестера на который данные были записаны (были записи на 3 различных винта, один из которых рейд массив).
Чаще всего теряется один из старших битов (типа 24-й бит в unsigned long или 24-й в unsigned long long). Других потерянных бит не замечено.
Термин "потерянный" возможно применяю в данном случае не верно. Т.к. заметно искажение только при его инвертировании. Соответственно если был сбой и он вместо 1 записал сбойную 1 - этого я не найду.
Система молчит про контроль целостности данных. Винт тоже. У винтов и рейда все показатели в порядке (блоки не сыпятся, SMART в порядке).

Сталкивался ли кто с подобным? В чем может быть проблема?

В ближайшем будущем хочу переустановить систему и MSVCE 2013. Но не уверен, что система виновата.
Кто что подскажет?
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2016, 14:42
Ответы с готовыми решениями:

ClientDataSet, Blob утечки памяти при записи в файл
столкнулся с такой ситуацией, есть ClientdataSet в котором есть блоб поле, которое я записываю...

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

При закачке игры на жесткий диск пишет "Ошибка при записи на диск"
БЕДА В СЕМЬЕ! В системе 2 жестких диска: первый - 250гб(разбит на 2 раздела), второй - 1тб Так...

При закачке игры на жесткий диск пишет "Ошибка при записи на диск"
В системе 2 жестких диска. Так вот, при попытке установить на жесткий диск игры со стима пишет...

119
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
10.06.2016, 10:37 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Petrolion Посмотреть сообщение
тестовая прога (x64)
как запустить ее на 12 ч тест? могу прогнать ее на нескольких машинах и посмотреть на результат
1
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
10.06.2016, 11:52  [ТС] 22
vxg, Спасибо огромное. К сожалению делаю это вручную.
1 запуск и 10 выводов бинарника со сравнением сторонней программой (FC) с эталонным файлом.
Затем перезапуск и все по новой. Сейчас подумаю как можно ее сделать в автоматическом режиме.

За два дня отловил три ошибки в памяти. (Если результат изменен именно в памяти, можно вторым проходом делать проверку сразу по памяти, добавлю в код.) С измененным кодом увидел, что чаще именно в памяти хранится неверный результат (отличный именно в 24-м бите).
Адреса 8-байтовых ячеек:
Код
172DB2928 (16) = 0001 0111 0010 1101 1011 0010 1001 0010 1000 (2)
1729E9928 (16) = 0001 0111 0010 1001 1110 1001 1001 0010 1000 (2)
1875D8928 (16) = 0001 1000 0111 0101 1101 1000 1001 0010 1000 (2)
Немного напрягает совпадение последних 3-х значений адреса. Но по большому счету, в случае постоянной сбойной ячейки число совпадающих значений адреса должно быть больше. Кто уточнит? Там ведь страничная (блочная) адресация?
Сам измененный код:
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
 
int main()
{
    int n = 1<<30;
    int k = 1<<24;
    int c = 1;
    int a = 0;
    ofstream fbin, ftxt;
    unsigned long long * b = new unsigned long long[n];
    for (int i = 0; i < n; i++)
        b[i]=k+i;
    cout << "Table ready." << endl << hex << "addres table: " << b << dec << endl;
    do
    {
        cout << endl << "Menu:" << endl << "1 - output binary (Data.dat)" << endl << "2 - output text (Data.txt)" << endl;
        cout << "3 - out data of cell (on screen)" << endl << "4 - put data to cell" << endl << "0 - Exit" << endl << "your choise: ";
        cin >> c;
        switch(c)
        {
        case 1:
            fbin.open("Data.dat",ios_base::binary);
            fbin.write(reinterpret_cast<char*>(b),n*sizeof(b[0]));
            fbin.close();
            break;
        case 2:
            ftxt.open("Data.txt");
            for (int i = 0; i < n; i++)
                ftxt << b[i] << endl;
            ftxt.close();
            break;
        case 3:
            cout << "Addres of cell: ";
            cin >> a;
            cout << hex << "Value must be: " << (k+a) << endl << "Value at addr " << a << " (" << (b+a) <<") is: " << b[a] << dec << endl;
            break;
        case 4:
            cout << "Addres of cell for modify: ";
            cin >> a;
            cout << "Old value: " << b[a] << endl << "Enter new value: ";
            cin >> b[a];
            break;
        }
        cout << "Done." << endl;
    } while (c != 0);
    cin.get();
return 0;
}
Toshkarik - Поможет ли ECC память - если результат операции помещаемый в нее изначально неверен? Возможно ли, что она так же сохранит неверный результат?
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
10.06.2016, 11:58 23
Цитата Сообщение от Petrolion Посмотреть сообщение
Сейчас подумаю как можно ее сделать в автоматическом режиме
что мешает считывать и сравнивать любое количество раз (например пока не поймает ошибку) в коде аналогичном предложенному здесь Битовые утечки при записи данных на диск
1
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
10.06.2016, 12:10  [ТС] 24
vxg, Сейчас как раз этим занимаюсь. Но как уже сказал, если ошибки в памяти, то лучше исключить работу с файлами - медленная операция.

Добавлено через 1 минуту
Вселяет оптимизм, что проблема все же может быть в софте, т.к. по железу memtest ошибок не нашел.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.06.2016, 17:23 25
Цитата Сообщение от Petrolion Посмотреть сообщение
т.к. по железу memtest ошибок не нашел
Ещё раз. mmtest НЕ способен находить ошибки процессора (или других узлов), он не для того разрабатывался
1
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
10.06.2016, 17:41 26
Petrolion, Может быть и ошибка процессора. Я один раз натыкался на похожее. Попробуйте обновить биос/микрокод процессора.
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
10.06.2016, 23:15 27
Evg, как мне кажется, если бы процессор сбоил, то проблемы были бы хуже. Как минимум, после сбоя, i бы не возращалась к нормальному состоянию.

Petrolion, я не знаю, как точно все устроено, но немного поразмыслил. Скорей всего у Вас битая память. Точнее 1 бит. 24-ый - потому что вы выбрали 64 битный тип данных, из-за выравнивания он всегда будет находится на этой позиции. ECC думаю помог бы в этой ситуации, так как сбой, скорей всего, происходит при записи в этот бит. Если у Вас больше 1 модуля, попробуйте протестировать каждый по отдельности. Если один, то попробуйте найти/купить/попросить другой модуль.

Добавлено через 2 минуты
Не исключаю, что проблема в контроллере памяти, который, с большой вероятностью, находится в процессоре. Тогда, как и предположил Evg, проблема в нём. Но вероятность очень маленькая.
1
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
11.06.2016, 11:47  [ТС] 28
Обнаружил неприятное, но сильно понятнее не стало.
"Бесконечный" код для теста был:
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include <fstream>
#include <conio.h>
 
using namespace std;
 
 
int main()
{
    int n = 1<<30;
    int k = 3<<24;
    unsigned long long c = 0;
    char o;
    bool te = true;
    int a = 0;
    ofstream flog;
    flog.open("Test.log",ios_base::app);
    unsigned long long * b = new unsigned long long[n];
    cout << hex << "Array at addres (" << b << "). " << dec << endl;
    flog << hex << "Array at addres (" << b << "). " << dec << endl;
    while (te)
    {
        for (int i = 0; i < n; i++)     //Asc tab
            b[i]=k+i;
        cout << "Table asc ready. Read:" << hex;
        flog << "Table asc ready. Read:" << hex;
        for (int m = 0; m < 8; m++)
        {
            cout << m;
            flog << m;
            c = k;
            for (int i = 0; i < n; i++,c++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
 
        for (int i = 0; i < n; i++)     //Clr tab
            b[i]=0;
        cout << "Table clear ready. Read:" << hex;
        flog << "Table clear ready. Read:" << hex;
        for (int m = 0; m < 8; m++)
        {
            cout << m;
            flog << m;
            for (int i = 0; i < n; i++)
                if (b[i] != 0)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: 0" << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: 0" << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
 
        for (int i = 0; i < n; i++)
            b[i]=0xffffffffffffffff;
        cout << "Table bit ready. Read:" << hex;
        flog << "Table bit ready. Read:" << hex;
        for (int m = 0; m < 8; m++)
        {
            cout << m;
            flog << m;
            c = 0xffffffffffffffff;
            for (int i = 0; i < n; i++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
    }
    flog.close();
    cin.get();
return 0;
}
Код
Заполнение массива восходящими значениями от определенной величины.
Проверка массива на соответствие заполненному (8-16 раз).
Очистка массивы нулями.
Проверка все ли нули (8-16 раз).
Заполнение массива всеми заполненными битами.
Проверка всех бит на наличие заполнения (8-16 раз).
и все по новой...
Выход по Esc затем y.
Лог пишется параллельно в файл.
Обнаружил что если при запуске ошибка возникла в памяти, то она есть уже при всех считываниях (разумеется). Но при этом заполнение этого же массива нулями не показывает наличие сбоя в памяти при заполнении. Так же ведет себя заполнение единицами. Но при втором круге - заполнение восходящими значениями, опять возникает ошибка там же либо в другой ячейке. И так все время.
Если же с самого начала тест на возрастающих значениях ошибок не показал, то он его не покажет и через несколько часов.
Т.е. есть закономерность при запуске. Теоретически действительно может быть одно из ядер процессора. Только как узнать какое именно? (кол-во я получить могу, но вот номер...)
И опять же не без НО. Но почему при заполнении нулями и единицами сбоев нет совсем. Должны быть если это проц.
В приложенном файле логи ошибочных и удачных запусков.
В первом - кол-во проходов 16 для int k = 1<<24;
Во втором проходов 8 для int k = 3<<24;
Evg 4 версия мемтеста уже работает с памятью каждым ядром процессора по отдельности (параллельно и последовательно). Т.е. получается, что в данном случае сбой не в памяти, а возможно, в процессоре или в софте при расчете. Тогда почему при том же расчете при проверке, не происходит сбоя в том же самом ядре? Мой результат теста показал, что если ошибка появилась, то она уже есть все время в пределах текущего запуска и массива.
vxg можешь попробовать этот код запустить? Или может мой готовый exe файл дать? (На случай если у меня C++ погнал)
Вложения
Тип файла: zip Logs.zip (1.5 Кб, 3 просмотров)
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
11.06.2016, 11:58 29
Цитата Сообщение от Petrolion Посмотреть сообщение
кол-во я получить могу, но вот номер...
GetCurrentProcessorNumber
1
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
11.06.2016, 12:37 30
Тогда сначала надо привязать поток к процессору (SetThreadAffinityMask), а то он может в любое время перелететь на другое.

Добавлено через 19 минут
Цитата Сообщение от Petrolion Посмотреть сообщение
если ошибка появилась, то она уже есть все время в пределах текущего запуска и массива.
Тогда как-нибудь бы или узнать физический адрес этого места или хотя бы перезагрузить эту страницу по другому адресу и посмотреть, как будет после этого. Как бы только это сделать простым способом?..
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
11.06.2016, 14:16 31
Цитата Сообщение от Petrolion Посмотреть сообщение
Обнаружил что если при запуске ошибка возникла в памяти, то она есть уже при всех считываниях (разумеется). Но при этом заполнение этого же массива нулями не показывает наличие сбоя в памяти при заполнении. Так же ведет себя заполнение единицами. Но при втором круге - заполнение восходящими значениями, опять возникает ошибка там же либо в другой ячейке. И так все время
Для порядку надо ещё и на бинарный код посмотреть. Я в intel'овской системе команд не разбираюсь, но, возможно, кто-то сдюжит на ассемблере целенаправленный тест написать. Тут важным моментом является то, что первый цикл с точки зрения построения кода и его исполнения принципиально отличается от второго и третьего. В первом цикле на каждой итерации изменяется значение в регистре, из которого затем данные попадают в память. Во втором и третьем цикле значения в этом регистре вычисляются вне цикла и внутри цикла уже не модифицируются. И если на какой-то итерации в первом цикле регистр оказался с неправильным значением, то с этого момента все записи в память пойдёт с неправильным значением

Цитата Сообщение от Petrolion Посмотреть сообщение
Мой результат теста показал, что если ошибка появилась, то она уже есть все время в пределах текущего запуска и массива
Тут уже писали, что если данный фрагмент кода постоянно исполняется на одном и том же ядре, то такое поведение вполне логично

В реальности процессор исполняет намного больше, чем написано в этом примере. Тут работа идёт с большим объёмом данных (1 гигабайт). А потому в процессе исполнения циклов постоянно работает механизм вытеснения данных из кэша. При этом кэши первого уровня, насколько я понимаю, находятся на каждом ядре, а кэши второго и третьего уровня общие. При протравливании кэша первого уровня ещё работает механизм когерентности кэшей, чтобы инвалидация кэша распространилась на все ядра. Сам процесс записи непосредственно в память тоже достаточно сложный, т.к. между кэшем и непосредственно планкой памяти куча всяких механизмов.

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

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Тут работа идёт с большим объёмом данных (1 гигабайт)
Пардон, тут 4 гигабайта. Если физической памяти меньше, то будут ещё и откачки-подкачки виртуальных страниц, что тоже делается через операционную систему

Добавлено через 6 минут
Цитата Сообщение от Evg Посмотреть сообщение
Правда этот вариант отбрасывается, т.к. в этом случае дефектным было бы значение только по одному адресу в памяти, а не в большом блоке
Увидел логи, по ходу я словесное описание не правильно понял. Сбой всё-таки единичный (портится значение только в одном адресе памяти). Т.е. варианты с проблемами, вызыванными прерыванием операционной сиситемы, скорее всего отбрасываются. Но странным выглядит то, что сбой происходит примерно по одним и тем же виртуальным адресам. Т.е. тут дело скорее в подсистеме памяти (начиная от кэша и далее), чем в вычислительных узлах процессора

Так что для порядку имеет смысл провести эксперимент с привязкой исполнения к конкретному ядру

Добавлено через 1 минуту
Обнуление и объединичивание блока памяти попробуй выкинуть из теста. По идее это лишний мусор, который только мешает. Так же полезно было бы выкинуть обработку нажатия клавиши и всю печать переделать на printf/fprintf. Это сильно упростит код функции main (на тот случай, если кто-то захочет проанализировать бинарный код). И оставить только одну печать (либо в лог, либо на экран)

Добавлено через 2 минуты
И проверку делать не по 8 раз, а по одному. Т.е. минимизировать пример, вопсроизводящий проблему

Добавлено через 3 минуты
И ещё одно наблюдение (правда ни на какие мысли не навело). По адресу 19EA69918 дефект всегда заключается в том, что в 24-м бите имеется единица, но должен быть 0, а по адресу 1A27BC928 ситуация всегда обратная
3
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
11.06.2016, 16:25  [ТС] 32
Evg, спасибо за детальность. Поправки по ходу. Объем физической памяти 16 гиг. Своп вообще отключен. Процесс идет на одном ядре. Правда не зафиксировал его на определенном, но пока не возникает переполняющих потоков, он с него вроде не слазит. Объем массива для обработки 8 гиг. (unsigned long long). Кэши первого и второго уровней раздельны. Третий уровень общий.
Бит меняет значение с непонятно чего. Возможно при вычислении в момент присвоения (потому и еще два блока обнуления и заполнения). Действительно сейчас хочу уменьшить кол-во проверок до 2-х. Добавил по подсказке nonedark2008 получение номера ядра. Пока не отловил ошибку. Думаю добавить освобождение и повторное выделение памяти под массив. Чтобы спровоцировать ошибки без перезапусков.
Так же добавил 4-й блок:
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
        c = (unsigned long long)k;
        for (int i = 0; i < n; i++,c++)     //Asc2 tab
            b[i]=c;
        cout << "Table asc2 ready. Read:" << hex;
        flog << "Table asc2 ready. Read:" << hex;
        for (int m = 0; m < 8; m++)
        {
            cout << m;
            flog << m;
            c = k;
            for (int i = 0; i < n; i++,c++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
В нем уже нет вычислений при присвоении. Надеюсь будет результат. Но пока ловлю ошибку.
Много лет назад занимался ассемблером на 80286 и 80386, но теперь вряд ли потяну разобрать полученный бинарник даже с облегчениями типа fprinf или malloc. :-(
Возможно обнаружение ошибки может заключаться не в обнулении или установке 24 бита, а в том что в процессе ошибки мы ее замечаем. Т.е. если ошибочно бит сбрасывается, но в нем и так 0 то мы ее просто не видим. ("Видишь суслика? - Нет. - А он есть!") и наоборот, при ошибочной установке бита если он и так 1 . Т.о. ошибок может быть и больше.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
11.06.2016, 16:48 33
Этот пример не соответствует тому, на котором возникала ошибка. Ошибка возникала в цикле

C
        for (int i = 0; i < n; i++)     //Asc tab
            b[i]=k+i;
и именно от этого цикла надо плясать. Т.е. берёшь программу из поста #28 и потихоньку отрезаешь ненужное. Использование функции printf нужно для того, чтобы она так и остались в виде вызова функций, в то время как для std::cout возможно что-то проинлайнится компилятором из внутренностей оператора << и будет мешать смотреть код (т.е. на фоне огромной простыни кода сложнее будет найти нужный цикл и посмотреть, чего там ещё компилятор понаделал)
1
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
11.06.2016, 18:53  [ТС] 34
Запустил последний код и погонял его с проца на проц.
Не пойму что с моими лыжами... чего не едут. Вообще взрыв мозга.
Ошибки действительно стали появляться чаще, по разным адресам, в разных тестах (кроме всех нулей). Один раз может появиться, при этом во второй проверке ошибки нет. Появились ошибки в битовом заполнении всеми единицами.
Вложил ниже лог запуска. С проца на проц пересаживал задачу вручную (через виндовый диспетчер).
Запускаемый код:
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <iostream>
#include <fstream>
#include <conio.h>
#include <Windows.h>
using namespace std;
 
 
int main()
{
    int n = 1<<30;
    int k = 3<<24;
    unsigned long long c = 0;
    char o;
    bool te = true;
    int a = 0;
    ofstream flog;
    flog.open("Test.log",ios_base::app);
    
    while (te)
    {
        unsigned long long * b = new unsigned long long[n];
        cout << hex << "Array at addres (" << b << "). " << dec << " Proc: " << GetCurrentProcessorNumber() << endl;
        flog << hex << "Array at addres (" << b << "). " << dec << " Proc: " << GetCurrentProcessorNumber() << endl;
        for (int i = 0; i < n; i++)     //Asc tab
            b[i]=k+i;
        cout << "Table asc ready. Read:" << hex;
        flog << "Table asc ready. Read:" << hex;
        for (int m = 0; m < 2; m++)
        {
            cout << m;
            flog << m;
            c = k;
            for (int i = 0; i < n; i++,c++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
 
        for (int i = 0; i < n; i++)     //Clr tab
            b[i]=0;
        cout << "Table clear ready. Read:" << hex;
        flog << "Table clear ready. Read:" << hex;
        for (int m = 0; m < 2; m++)
        {
            cout << m;
            flog << m;
            for (int i = 0; i < n; i++)
                if (b[i] != 0)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: 0" << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: 0" << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
 
        for (int i = 0; i < n; i++)
            b[i]=0xffffffffffffffff;
        cout << "Table bit ready. Read:" << hex;
        flog << "Table bit ready. Read:" << hex;
        for (int m = 0; m < 2; m++)
        {
            cout << m;
            flog << m;
            c = 0xffffffffffffffff;
            for (int i = 0; i < n; i++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
 
        c = (unsigned long long)k;
        for (int i = 0; i < n; i++,c++)     //Asc2 tab
            b[i]=c;
        cout << "Table asc2 ready. Read:" << hex;
        flog << "Table asc2 ready. Read:" << hex;
        for (int m = 0; m < 2; m++)
        {
            cout << m;
            flog << m;
            c = k;
            for (int i = 0; i < n; i++,c++)
                if (b[i] != c)
                {
                    cout << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                    flog << endl << "Error at adr(" << (b+i) <<"). Value: " << b[i] << " must be: " << c << " Proc: " << GetCurrentProcessorNumber() << endl;
                }
            if (_kbhit())
            {
                o = _getch();
                if (o == 27)
                {
                    cout << " Exit ? ";
                    o = _getche();
                    cout << endl;
                    if (o == 'y' || o == 'Y')
                        te = false;
                }
            }
        }
        cout << endl;
        flog << endl;
        delete [] b;
    }
    flog.close();
return 0;
}
Уже вовсю подозреваю мелкомягких. Доказать не могу.
Вложил откомпилиный у меня на MSVS2010 код в архиве.
Может ли кто в 2013 или 2015 его скомпилить и положить. Чтобы запустить мог. Может это система...
Вложения
Тип файла: zip Test.zip (3.1 Кб, 3 просмотров)
Тип файла: zip proba.zip (11.6 Кб, 4 просмотров)
1
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.06.2016, 19:49 35
Цитата Сообщение от Evg Посмотреть сообщение
Но странным выглядит то, что сбой происходит примерно по одним и тем же виртуальным адресам. Т.е. тут дело скорее в подсистеме памяти (начиная от кэша и далее), чем в вычислительных узлах процессора
ХЗ где но скорее всего в процессоре. Надо смотреть еррату на конкретную модель камня.
0
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
11.06.2016, 20:16  [ТС] 36
Цитата Сообщение от avgoor Посмотреть сообщение
ХЗ где но скорее всего в процессоре. Надо смотреть еррату на конкретную модель камня.
А где такое посмотреть? AMD Phenom II X6 1065T
Сейчас друг забросил откомпиленное в MSVS2015. Почти те же самые яйца - вид сбоку. Только стало больше ошибок на массиве заполненном всеми битами. :-(
Уже задумываюсь порешить систему.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.06.2016, 20:42 37
Petrolion, Начните с обновления биоса.

Добавлено через 12 минут
Цитата Сообщение от Petrolion Посмотреть сообщение
А где такое посмотреть?
Например http://developer.amd.com/wordp... Rev_Gd.pdf начиная со стр. 30
Пример от туда, правда не для вашего процессора:
A DIV Instruction Followed Closely By Other Divide Instructions May Yield Incorrect Results
1
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
11.06.2016, 20:43  [ТС] 38
avgoor, новее для моей матери биоса нет.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.06.2016, 20:49 39
Цитата Сообщение от Petrolion Посмотреть сообщение
новее для моей матери биоса нет
Пичалька. Ну тогда, возможно,
Цитата Сообщение от Petrolion Посмотреть сообщение
Уже задумываюсь порешить систему.
спасет отца русской демократии. Хотя вряд ли.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
11.06.2016, 22:09 40
Цитата Сообщение от Petrolion Посмотреть сообщение
Уже вовсю подозреваю мелкомягких. Доказать не могу.
1) Поставить QtCreator с mingw и проверить ошибку в нем.
2) Загрузиться с лайв-CD Дебиана, sudo apt-get install qt-sdk в консольке, опять-же проверить все в QtCreator. Сразу уточняю, лайв ставит новый софт в оперативку, на хард он ничего не пишет.
1
11.06.2016, 22:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2016, 22:09
Помогаю со студенческими работами здесь

Измерить скорость чтения и записи данных на диск
Определить скорости чтения и записи блока данных доступных для чтения и записи логических дисков....

Ошибка при записи на диск
Здравствуйте, у меня возникла проблема с жесткими дисками. Многим известна игровая платформа...

Ошибки при записи на DVD диск
Помогите, пожалуйста, разобраться со следующей ситуацией. Занимался записью iso-образов на DVD...

Жесткий диск тормозит при записи на него
У меня есть старый компьютер с процессором Celeron 1700 MHz. Выпуска начала 2000-х. Это мой первый...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru