Паралельні обчислення (Судаков О.О.)

Паралельні обчислення (Судаков О.О.)

Повідомлення GorbachenkoVasyl » 14 вересня 2014, 09:27

GorbachenkoVasyl
Site Admin
 
Повідомлень: 150
З нами з: 16 вересня 2010, 19:59

Re: Паралельні обчислення (Судаков О.О.)

Повідомлення Василь » 12 жовтня 2014, 21:05

Команди, які потрібно знати для користування командним рядком LINUX:
ls - дивимось файли в поточному каталозі
ll (as symlink (ls -l)) - дивимось файли в поточному каталозі, але більш розширено
cat - вивід на стандартний потік виводу вмісту файлу
less - показати вміст файлу з прокруткою вверх і вниз
more - показати вміст файлу, але тільки з прокруткою вниз
sort - сортування
grep - вибрати все з, або все без.....
awk - вибрати щось конкретне, або з якоюсь умовою
wc - хз, для статистики і т.п.
echo - вивід на екран повідомлення
sh - запуск оболочки шелла (bash)
./ - запуск чогось з поточного каталогу, після цього треба вказувати ім'я файлу
/ - корінь
. - поточний каталог
cd - змінити діректорію на
rm - видалити щось
mv - перемістити файли або перейменувати
cp - копіювати
touch - створити пустий файл
tail - показати хвіст
tree - вивід дерева
mc - аналог FAR під віндовс (Midnight Commander)
vi - доісторичний текстовий редактор, який дуже полюбляє Судаков О.О.
ps - вивести список всіх процесів, які запущені на машині
top - вивести списко всіх процесів та слідкувати за ними в реальному часі з відображенням різної інформації...
route - маршрутизація....
netstat - статус мережі
reboot - перезавантаження машини
logout - вийти з сеансу
ssh - під'єднатися до ssh сервера, для керування віддаленою *NIX системою
scp - secure copy. Копіювати файл з однієї *NIX машина на іншу використовуючи протокол SSH (тобто передача шифрується)
rmdir - видалити директорію
mkdir - створити директорію
man - дивитися документацію на щось...
<CTRL>+<C> - припинити виконання чогось..
<CTRL>+<Z> - перевести виконання чогось в фоновий режим (СВЕРНУТЬ в windows)
fg - розвернути те, що було переведено в фоновий режим (foreground)
halt - завершення роботи
shutdown - завершення роботи

Розібратися з перенаправленням:
| - перенаправити стандартний вівід однієї програми на стандартний вхід іншої програми
> - перенаправити стандартний вивід однієї програми до якогось файлу(перезаписати його)
>> - перенаправити стандартний вивід однієї програми до якогось файлу(дописати його)
Аватар користувача
Василь
 
Повідомлень: 907
З нами з: 15 жовтня 2010, 02:08

Re: Паралельні обчислення (Судаков О.О.)

Повідомлення Василь » 29 жовтня 2014, 17:34

Компіляція програми на кластері:
Код: Виділити все
g++ -fopenmp -O3 code.cpp -o code.out

тут вказується, що ми компілюємо саме C++ програму(c++), вказуємо що застосовуємо OPENMP(-fopenmp), кажемо, що використовувати оптимізацію ( -O3 ), тіпа, якщо прогер щось прошляпив по коду, то компілятор це побачить і оптимізує як потрібно, та вихідний бінарний файл( -o code.out)
Вхідний файл code.cpp, вихідний файл code.out.


Код: Виділити все
OMP_NUM_THREADS=3 ./code.out

Тут ми запускаємо програму та кажемо, щоб вона виконувалася в три потоки(OMP_NUM_THREADS=3)


Код: Виділити все
export HOME=/home1/grid/testbed/tb116
export HOME=/home1/grid/testbed/tb180

Використовуємо, для того щоб під'єднати свій домашній каталог, поки на кластері ідуть відновлювальні роботи

Код: Виділити все
cd ~ && cp -rv ../tb054/parallel_and_distributed .

Копіюємо з папки Судакова О.О. папку "parallel_and_distributed" в свій домашній каталог
Аватар користувача
Василь
 
Повідомлень: 907
З нами з: 15 жовтня 2010, 02:08

Re: Паралельні обчислення (Судаков О.О.)

Повідомлення Василь » 12 листопада 2014, 23:07

Начало работы с OpenMP*
Эффективное распределение нагрузки между потоками с помощью OpenMP*
OpenMP* Examples

Задача. C++. Нахождение обратной матрицы методом Гауса. OpenMP. Выдрано код с интернета, дошлифовано. Втыкнуто директивы OpenMP.
Код: Виділити все
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */
#include <omp.h>
using namespace std;


//==============================================================================

int MatrPrint(int cnt_str,double *mass)
{
        cout<<" -> MatrPrint ( "<<cnt_str<<" x "<<cnt_str<<" ) ;\n\r";
        for (int i = 0 ; i < cnt_str * cnt_str ; i++)
        {
                cout<<*(mass+i)<<"\t";
                if ((i+1)%cnt_str==0) cout<<"\n";
        }
        cout<<"\n";
        return 1;
}
//==============================================================================
//Нахождение обратной матрицы методом Гаусса
//Входные данные: double *a - исходная матрица;
//                int n     - размерность матрицы[n*n];
//    Sring name_file_save  - имя файла для записи резльтатов счета.
//Выходные данные: double *a - обратная матрица, вычисленная по методу Гаусса, [n*n].
int matr_inv_gause(double *a, int n)
{
    double e1, d, *b, *c, y, w, p; ;
    int i, j, k, *z;

    e1=1.e-6;  d=1;

    z= new int[n];
    c= new double[n];
    b= new double[n];

    #pragma omp parallel for shared(z,n) private(i)
    for(i=0; i<n; i++)
   *(z+i)=i;

   //private(i,k,y,j,k,w) public(n,z,a,b)

    for(i=0; i<n; i++)
    {
   k=i;
   y=*(a+i*n+i);
        if(i+1 <= n )
       for(j=1+i; j<n; j++)
       {
      w=*(a+n*i+j);
           if(fabs(w)>fabs(y))
           {
          k=j;
               y=w;
           }
           }
       d=d*y;
//проверка на близость к врождению матрицы
       if(fabs(y)<e1) return 2;
       y=1./y;
       //  shared(n,c,b,a,y,i) private(i)
       #pragma omp parallel for  shared(n,c,b,a,y,i) private(j)
       for(j=0; j<n; j++)
       {
      *(c+j)=*(a+n*j+k);
      *(a+n*j+k)=*(a+n*j+i);
      *(a+j*n+i)=-(*(c+j))*y;
      *(b+j)=*(a+i*n+j)*y;
      *(a+i*n+j)=*(b+j);
       }
       j=*(z+i);
       *(z+i)=*(z+k);
       *(z+k)=j;
       *(a+i*n+i)=y;
       //  shared(i,a,n) private(k,j)
       #pragma omp parallel for shared(i,a,n) private(k,j)
       for(k=0; k<n; k++)
       if(k != i)
      for(j=0; j<n; j++)
           if(j != i)
               *(a+k*n+j)=*(a+k*n+j)-(*(b+j))*(*(c+k));
   }
   //   shared(a,i,k,n) private(j,w)
   #pragma omp parralel for  shared(a,i,k,n) private(j,w)
   for(i=0; i<n; i++)
   while(1)
   {
           k=*(z+i);
           if(k == i) break;
           for(j=0; j<n; j++)
           {
           w=*(a+i*n+j);
           *(a+i*n+j)=*(a+k*n+j);
           *(a+k*n+j)=w;
           }
           p=*(z+i);
           *(z+i)=*(z+k);
           *(z+k)=p;
           d=-d;
   }

    delete[] z;
    delete[] b;

    delete[] c;

    return 0;
}
//==============================================================================

int main(int argc, char* argv[])
{

   
        srand (time(NULL));

        int cnt_str = 10000;    // сторона

        // создание матрицы
        double *MyMatr= new double [cnt_str*cnt_str];
        for( int i = 0 ; i < cnt_str*cnt_str ; i++ )
        {
                        //*( MyMatr + i ) = rand() % 10;
                        *( MyMatr + i ) = i*i;
        }

//        MatrPrint(cnt_str,MyMatr);
//   cout<<" OpenMP("<<_OPENMP<<") is enabled \n\r Count of threads is "<<omp_get_max_threads()<<endl<<endl;
   long double clockStart, clockStop;
   clockStart = omp_get_wtime();
//   for (unsigned long zu = 0 ; zu < 100000; zu++)
            matr_inv_gause(MyMatr,cnt_str);
   clockStop = omp_get_wtime();
   cout<<" Seconds: " << (clockStop - clockStart) <<endl;
//   cout<<" Timer accuracy :" <<  omp_get_wtick() <<endl << endl;
   
//        MatrPrint(cnt_str,MyMatr);

        // Очистка памяти
        delete [] MyMatr;
//        system("pause");
        return 0;
}
//---------------------------------------------------------------------------

Результаты тестирования.
Зображення
Аватар користувача
Василь
 
Повідомлень: 907
З нами з: 15 жовтня 2010, 02:08


Повернутись до Медична фізика

Хто зараз онлайн

Зараз переглядають цей форум: Немає зареєстрованих користувачів і 3 гостей