заполнить память случайными данными - PullRequest
5 голосов
/ 11 августа 2009

Есть ли способ заполнить свободную оперативную память на машине с Linux случайными данными?

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

Если мое понимание верно, можно увидеть случайные колебания результата после предела одинарной точности в такой программе. То есть, если вы запускаете одну и ту же программу с одним и тем же вводом несколько раз, вы каждый раз получаете случайно разные результаты. То, что вы видите (случайная часть), зависит от случайных значений в свободной оперативной памяти машины. Но на практике, если вы неоднократно запускаете программу на одной и той же машине, одни и те же части памяти, как правило, используются повторно, в которых содержатся одинаковые случайные данные, каждый раз приводя к одному и тому же результату.

Моя идея состоит в том, что если бы вы могли перезаписать память случайными данными, вы бы фактически увидели случайные колебания в выходных данных вашей программы. Это намного облегчит поиск этих ошибок.

Эта идея не так, или, если нет, как мне заполнить память? Можно ли передать / dev / random в ОЗУ или что-то еще?

Ответы [ 7 ]

5 голосов
/ 11 августа 2009

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

Если ваша программа на Фортране объявляет переменную с плавающей запятой одинарной точности, компилятор выделит 32-битную ячейку в памяти для хранения значения. Каждый раз, когда ваша программа читает данные из переменной, процессор извлекает 32-битное значение из ячейки. Каждый раз, когда вы присваиваете переменную, процессор записывает в ячейку 32-битное значение. Ни при каких обстоятельствах случайные биты не должны «сливаться» со значением из ячеек до или после ячейки.

Хотя арифметика с плавающей запятой не является точной, она также не случайна. Если вы подсчитаете 1.0 / 3.0 + 1.0 / 3.0 + 1.0 / 3.0) тысячу раз, вы получите 0.99999... каждый раз.

Второй момент заключается в том, что когда программа выполняется в Linux, операционная система тщательно инициализирует всю память данных до нуля. Это сделано для того, чтобы ваша программа не работала по-разному при каждом запуске: это было бы ПЛОХО. РЕДАКТИРОВАТЬ: еще одна причина, по которой это делается, заключается в предотвращении утечки частной информации из одного процесса в другой.

(Комментаторы: обратите внимание, что я сознательно отсканировал ряд вопросов, чтобы упростить объяснение.)

4 голосов
/ 11 августа 2009

Если у вас недавний (> = 2,4, похоже) glibc, вы можете использовать переменную окружения MALLOC_PERTURB_, чтобы malloc () возвращала память, для которой установлено какое-то значение. См http://udrepper.livejournal.com/11429.html и внутри http://people.redhat.com/drepper/defprogramming.pdf

Тогда вопрос в том, использует ли ваша программа на Фортране glibc malloc (), я думаю, это зависит от компилятора Фортрана.

2 голосов
/ 04 сентября 2009

Linux предоставляет вам /proc/pid/maps и /proc/pid/mem для вашего собственного удовольствия. Конечно, вы должны быть очень осторожны при написании там. Кроме того, имейте в виду, что единственный сегмент памяти, доступный каждому процессу, является его собственным, так что вам, вероятно, придется выполнить некоторые присоединения и исправления кода, чтобы получить то, что вам нужно. В любом случае, удачи. :)

edit: Это все еще в несколько раз сложнее, чем аудит кода, который также имеет больше шансов раскрыть фактический источник проблемы.

2 голосов
/ 11 августа 2009

То, чего вы хотите достичь, хотя и благородно в намерениях, и интересно задумано, помнит меня о планах Уайла Э. Койота поймать бегуна, тогда как винтовка и снайперская акция были бы лучшим вариантом.

Если у вас возникла проблема, это означает, что в вашем коде есть структурная проблема, и вы теряете контроль над своей программой. Хотя я прекрасно знаю, как программное обеспечение разрабатывается в академических кругах и на фортране, бросаться с обрыва только потому, что остальной мир это делает, проблематично.

То, что вам нужно сделать, - это аудит вашего кода. а затем избить какого-нибудь аспиранта, если он снова все испортит.

2 голосов
/ 11 августа 2009

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

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

1 голос
/ 11 августа 2009

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

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

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

1 голос
/ 11 августа 2009

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

Со стороны Фортрана, вы говорите, что числа со смешанной точностью используются взаимозаменяемо? Я не понимаю, в чем проблема.

Но я понятия не имею, как заполнить свободную память в Linux чем-либо.

...