Всегда у меня этот 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
понедельник, 28 декабря 2009 г.
понедельник, 21 декабря 2009 г.
OpenMP links
Использование библиотеки OpenMP на сайте кафедры ИКТ (где она находится и как расшифровывается - непонятно)
32 подводных камня OpenMP при программировании на С++. Очень интересная статья.
HabraHabr: Расшифровка пароля по MD5-хэшу в несколько потоков (интересные комменты)
Intel: Эффективное распределение нагрузки между потоками с помощью OpenMP Там есть ссылки на другие статьи и ресурсы на intel.com
32 подводных камня OpenMP при программировании на С++. Очень интересная статья.
HabraHabr: Расшифровка пароля по MD5-хэшу в несколько потоков (интересные комменты)
Intel: Эффективное распределение нагрузки между потоками с помощью OpenMP Там есть ссылки на другие статьи и ресурсы на intel.com
суббота, 19 декабря 2009 г.
HPC и жись
Вот строют, строют эти многопроцессорные ЭВМ... И процессоров несколько тысяч, и быстродействие уже петафлопах мерять стали...
А зачем это нужно, товарищи ученые? Геном расшифровывать? Ну расшифровывайте, если интересно. А для честных мелких предпринимателей, занимающихся почетным делом купли-продажи китайского барахла в нашей стране, эта ваша многопроцессорность нужна вообще? Это ж, блин, средний класс, надежда, можно сказать, государства.
Короче, интересно мне стало, где супервычисления используют, окромя НИИ и ВУЗов. Порылся в интернете. В основном - общие фразы, типа, круг задач широк - и банки, и нефтянка, и все-все-все. А конкретики - никакой почти.
Нашел маленькую статью Применение параллельных вычислений для автоматизации бизнес-процессов. Вооо, тут все жизненно - бухгалтерия, бонусы, никакого генома. Но рассмотрено всего две операции, где можно напараллелить - расчет зарплаты и загрузка данных в ИТ-систему.
Ну и вот чуть-чуть - Суперкомпьютеры становятся настольными в издании Промышленные Ведомости. Тут сказано, что используют 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 приводит к ошибкам.
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() );
}
#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 ...
Соло из это песенки оказалось весьма примитивным (не сверялся, правда, с инетовскими подборами, но звучит правдоподобно):
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 можно справиться своими силами.
вот хорошая статья про создание прог на нескольких языках. Кратко:
программерам численных методов нужно, обычно, взаимодействие C-Fortran. Т.е. из проги, написанной на одном из этих языков, надо вызвать подпрограмму на другом. Как назло, эти языки отличаются в плане обращения с подпрограммами весьма сильно, что необходимо учитывать:
1. Соглашение о вызовах. В Fortran параметры очищаются из стека вызываемой функцией. В С - вызывающей прогой. Плюс аргументы запихиваются в стек в разном порядке: в С - начиная с последнего, в Fortran - с первого.
Неудобно, короче. Но в С есть возможность организовать вызов функции и так и так: с помощью _cdecl - по-сишному, с помощью _stdcall - по-фортрановски.
2.Передача параметров. В Fortran - по ссылке.
3. Передача строк. !!. Строка в С заканчивается \0. А в Fortran - нет, вместо этого в функцию неявно передается длина строки.
4. Массивы в Си нумеруются с 0, в Фортране - с 1. Матрицы (2-мер массивы) в Си хранятся по строкам, в Fortran - по столбцам.
Помянутая статья помогает разобраться с 1-3. С п.4 можно справиться своими силами.
Подписаться на:
Сообщения (Atom)