понедельник, 28 декабря 2009 г.

Static в С

Всегда у меня этот static какие-то затруднения вызывал, а на самом деле все просто.

Если в модуле глобальная переменная объявлена static, то она видна только из этого модуля. То же самое, если static стоит в объявлении функции.

Если в функции локальная переменная объявлена static, то она сохраняет свое значение между вызовами функций. Инициализируется только один раз. Вот пример - скользящее среднее:

double average(double x)
{
static double count = 0;
static double sum = 0;

++count;
sum += x;

return sum/count;
}

int main()
{
cout << "average = " << average(1) << endl;
cout << "average = " << average(2) << endl;
cout << "average = " << average(4) << endl;
}

В функции average переменные count и sum будут инициализированы нулями только при первом вызове функции. Можно объявлять в разных функциях статические переменные с одинаковыми именами - компилятор следит за соответсвием.

Ой, а вот тут нашел на YouTube как дядька под гармошку на площади поет Русское поле экспериментов чуть ли не лучше Летова: http://www.youtube.com/watch?v=Bxhx1tlzn44

понедельник, 21 декабря 2009 г.

OpenMP links

Использование библиотеки OpenMP на сайте кафедры ИКТ (где она находится и как расшифровывается - непонятно)

32 подводных камня OpenMP при программировании на С++. Очень интересная статья.

HabraHabr: Расшифровка пароля по MD5-хэшу в несколько потоков (интересные комменты)

Intel: Эффективное распределение нагрузки между потоками с помощью OpenMP Там есть ссылки на другие статьи и ресурсы на intel.com

суббота, 19 декабря 2009 г.

HPC и жись

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

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

Короче, интересно мне стало, где супервычисления используют, окромя НИИ и ВУЗов. Порылся в интернете. В основном - общие фразы, типа, круг задач широк - и банки, и нефтянка, и все-все-все. А конкретики - никакой почти.

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

Ну и вот чуть-чуть - Суперкомпьютеры становятся настольными в издании Промышленные Ведомости. Тут сказано, что используют HPC в САПР. И все пока...

пятница, 18 декабря 2009 г.

OpenMP & Visual Studio notes

1. Свойства проекта
Debugging -> Command Arguments - можно прописать аргументы командной строки Вашей проги и дебужить из студии (а не запускать прогу из консоли)

С/С++ -> Language -> OpenMP Support - вкл/выкл поддержку OpenMP. Если включено -
определен символ _OPENMP. Если нет - все прагмы игнорируются.

2. Кусочек кода отсюда

float sum = 10.0f;
MatrixClass myMatrix;
int j = myMatrix.RowStart();
int i;
#pragma omp parallel
{ #pragma omp for firstprivate(j) lastprivate(i) reduction(+: sum)
for(i = 0; i < count; ++i)
{
int doubleI = 2 * i;
for(; j < doubleI; ++j)
sum += myMatrix.GetElement(i, j);
} }

Не знаю, насколько критичен здесь lastprivate, но отсутствие firstprivate и reduction приводит к ошибкам.

вторник, 15 декабря 2009 г.

Sleep на языке C

Вот как можно реализовать функцию задержки на n секунд

#include time.h

/* Pauses for a specified number of milliseconds. */
void sleep( clock_t wait )
{
clock_t goal;
goal = wait + clock();
while( goal > clock() );
}

среда, 9 декабря 2009 г.

Подбор

Была такая довольно мирная песенка I was made for loving you baby группы Kiss, которую Scooter переделал в какой-то шум со своим фирменным Eeeee!

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

E F# G A B B G А F#
I was made for loving you, baby,

E F# G A B B G
You were made for loving me ...

Mixed-language programming

Мне, это, кажется в ближайшее время не понадобится, но:

вот хорошая статья про создание прог на нескольких языках. Кратко:

программерам численных методов нужно, обычно, взаимодействие C-Fortran. Т.е. из проги, написанной на одном из этих языков, надо вызвать подпрограмму на другом. Как назло, эти языки отличаются в плане обращения с подпрограммами весьма сильно, что необходимо учитывать:

1. Соглашение о вызовах. В Fortran параметры очищаются из стека вызываемой функцией. В С - вызывающей прогой. Плюс аргументы запихиваются в стек в разном порядке: в С - начиная с последнего, в Fortran - с первого.

Неудобно, короче. Но в С есть возможность организовать вызов функции и так и так: с помощью _cdecl - по-сишному, с помощью _stdcall - по-фортрановски.

2.Передача параметров. В Fortran - по ссылке.

3. Передача строк. !!. Строка в С заканчивается \0. А в Fortran - нет, вместо этого в функцию неявно передается длина строки.

4. Массивы в Си нумеруются с 0, в Фортране - с 1. Матрицы (2-мер массивы) в Си хранятся по строкам, в Fortran - по столбцам.

Помянутая статья помогает разобраться с 1-3. С п.4 можно справиться своими силами.