Lect_2_061015 (MPI)

PDF-файл Lect_2_061015 (MPI) Параллельное программирование для высокопроизводительных вычислительных систем (64214): Лекции - 11 семестр (3 семестр магистратуры)Lect_2_061015 (MPI) - PDF (64214) - СтудИзба2020-08-25СтудИзба
MPI17

Описание файла

Файл "Lect_2_061015" внутри архива находится в папке "MPI". PDF-файл из архива "MPI", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст из PDF

СпецкурсПараллельное программирование длявысокопроизводительныхвычислительных систем2015 – 2016 уч. г.Лекторы: доцент Н.Н.Попова,асс. В. А.БахтинЛекция 26 октября 2015 г.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 21Параллельное программирование длямногопроцессорных систем. MPI.Основные возможности.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 22ЛитератураMPI: A Message-Passing Interface Standardhttp://www.mpi-forum.org/docs/(http://parallel.ru/docs/Parallel/mpi1.1/mpi-report.html)Антонов А.С. Параллельное программирование с использованиемтехнологии MPI: Учебное пособие. -М.: Изд-во МГУ, 2004.-71 с.Немнюгин С.А., Стесик О.Л. Параллельное программирование длямногопроцессорных вычислительных систем систем.- СПб, БХВПетербургИнтернет ресурсы:https://computing.llnl.gov/tutorials/mpi, www.parallel.ru, intuit.ru,www.mpi-forum.org, www.open-mpi.org, www.openmp.orghttp://www.mcs.anl.gov/research/projects/mpi/www/www3Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 23Модели параллельных программСистемы с общей памятьюПрограммирование, основанное на потокахПрограмма строится на базе последовательной программыВозможно автоматическое распараллеливание компиляторомс использованием соответствующего ключа компилятораДирективы компиляторов (OpenMP, …)Системы с распределенной памятью Программа состоит из параллельных процессов Явное задание коммуникаций между процессами - “MessagePassing” Реализация - Message Passing библиотеки: MPI (“Message Passing Interface”) PVM (“Parallel Virtual Machine”) Shmem, MPT ( Cray)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 24Пример параллельной программыпрограммы на общей памятиСкалярное произведение двух векторов#include <stdio.h>#define N 1024int main(int argc, char *argv[]){ double sum;double a[N], b[N];int status, i, n =N;for (i=0; i<n; i++){a[i] = i*0.5; b[i] = i* 2.0; }sum =0;#pragma omp for reduction (+:sum)for (i=0; i<n; i++)sum = sum+a[i]*b[i];printf (“Sum=%f\n”, sum);}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 25MPI#include <stdio.h>#include <mpi.h>#define N 1024int main(int argc, char *argv[]){ double sum; double dot_prod;double a[N], b[N];int i, n =N;int size, myrank;n= n/ size;for (i=myrank*n; i<n; i++){a[i] = i*0.5; b[i] = i* 2.0; }sum =0;for (i=myrank*n; i<n; i++)sum = sum+a[i]*b[i];MPI_Reduce(& sum,& all_sum, 1,MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLMPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, If ( !myrank)&myrank);printf (“Dot product =%f\n”, dot_prod);MPI_Comm_size(MPI_COMM_WORLD, MPI_Finalize();&size);return 0;}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 26MPIMPI 1.1 Standard разрабатывался 92-94MPI 2.0 - 95-97MPI 2.1 - 2008MPI 3.0 – 2012Стандартыhttp://www.mcs.anl.gov/mpihttp://www.mpi-forum.org/docs/docs.htmlОписание функций http://www-unix.mcs.anl.gov/mpi/www/Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 27Цель MPIОсновная цель:Обеспечение переносимости исходных кодовЭффективная реализацияКроме того:Большая функциональностьПоддержка неоднородных параллельныхархитектурСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 28Реализации MPIMPICHLAM/MPIMvapichOpenMPIКоммерческие реализации Intel,IBM идр.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 29Модель MPIПараллельная программа состоит из процессов,процессы могут быть многопоточными.MPI реализует передачу сообщений междупроцессами.Межпроцессное взаимодействие предполагает: синхронизацию перемещение данных из адресного пространстваодного процесса в адресное пространство другогопроцесса.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 210Message passing =передача данных + синхронизацияProcess 0Process 1DataМогу я послать?ДаDataDataDataDataDataDataDataDataTimeТребуется взаимодействие между отправителем иполучателем сообщенийСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 211Модель MPI-программ• SPMD – Single ProgramMultiple Data• Одна и та же программавыполняется различнымипроцессорами• Управляющимиоператорами выбираютсяразличные частипрограммы на каждомпроцессоре.Текст программыКомпиляция:одна программаДля всех процессоровИсполняемый кодProcessor 0Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 2Processor122.12Модель выполненияMPI- программыЗапуск: mpirunПри запуске указываем число требуемых процессоров np иназвание программы: пример:mpirun –np 3 progНа выделенных узлах запускается np копий (процессов) указаннойпрограммы- Например, на двух узлах запущены три копии программы.02Каждый процесс MPI-программы получает два значения:1np – число процессовrank из диапазона [0 … np-1] – номер процессаЛюбые два процесса могут непосредственно обмениватьсяданными с помощью функций передачи сообщенийСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 213 13Основы передачи данных в MPIТехнология передачи данных MPI предполагаеткооперативный обмен.Данные посылаются одним процессом ипринимаются другим.Передача и синхронизация совмещены.Process 0Process 1Send(data)Receive(data)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 214Основы передачи данных в MPIНеобходимы уточнения процесса передачиProcess 0Process 1Send(data)Receive(data)Требуется уточнить:Как должны быть описаны данные ?Как должны идентифицироваться процессы?Как получатель получит информацию о сообщении?Что значить завершение передачи?Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 215Основные понятияПроцессы объединяются в группы.Каждое сообщение посылается в рамках некоторогоконтекста и должно быть получено в том же контексте.Группа и контекст вместе определяют коммуникатор.Процесс идентифицируется своим номером в группе,ассоциированной с коммуникатором.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 216Понятие коммуникатора MPIВсе обращения к MPI функциям содержаткоммуникатор, как параметр.Наиболее часто используемый коммуникаторMPI_COMM_WORLD:- определяется при вызове MPI_Initсодержит ВСЕ процессы программыДругие предопределенные коммуникаторы:- MPI_COMM_SELF – только один (собственный)процесс--MPI_COMM_NULL – пустой коммуникаторСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 217Типы данных MPIДанные в сообщении описываются тройкой:(address, count, datatype), гдеdatatype определяется рекурсивно как :предопределенный базовый тип, соответствующий типуданных в базовом языке (например, MPI_INT,MPI_DOUBLE_PRECISION)Непрерывный массив MPI типовВекторный типИндексированыый типПроизвольные структурыMPI включает функции для построенияпользовательских типов данных, например, типаданных, описывающих пары (int, float).Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 218Базовые MPI-типы данныхMPI datatypeC datatypeMPI_CHARsigned charMPI_SHORTsigned short intMPI_INTsigned intMPI_LONGsigned long intMPI_UNSIGNED_CHARunsigned charMPI_UNSIGNED_SHORTunsigned short intMPI_UNSIGNEDunsigned intMPI_UNSIGNED_LONGunsigned long intMPI_FLOATfloatMPI_DOUBLEdoubleMPI_LONG_DOUBLElong doubleСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 219Специальные типы MPIMPI_CommMPI_StatusMPI_datatypeСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 220Понятие тэгаСообщение сопровождается определяемымпользователем признаком – целым числом – тэгомдля идентификации принимаемого сообщенияТеги сообщений у отправителя и получателя должныбыть согласованы.

Можно указать в качествезначения тэга константу MPI_ANY_TAG.Некоторые не-MPI системы передачи сообщенийназывают тэг типом сообщения. MPI вводитпонятие тэга, чтобы не путать это понятие с типомданных MPI.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 221C:MPI helloworld.c#include <stdio.h>#include <mpi.h>int main(int argc, char **argv){MPI_Init(&argc, &argv);printf("Hello, MPI world\n");MPI_Finalize();return 0; }Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 222Формат MPI-функцийC (большие и маленькие буквы различаются):error = MPI_Xxxxx(parameter,...);MPI_Xxxxx(parameter,...);C++ (case sensitive):error = MPI::Xxxxx(parameter,...);MPI::Xxxxx(parameter,...);Имена констант – большими буквами.

Например:MPI_COMM_WORLDСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 223Функции определения средыint MPI_Init(int *argc, char ***argv)должна первым вызовом, вызывается только один разint MPI_Comm_size(MPI_Comm comm, int *size)число процессов в коммуникатореint MPI_Comm_rank(MPI_Comm comm, int *rank)номер процесса в коммуникаторе (нумерация с 0)int MPI_Finalize()завершает работу процессаint MPI_Abort (MPI_Comm_size(MPI_Comm comm,int*errorcode)завершает работу программыСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 224Инициализация MPIMPI_Init должна быть первым вызовом,вызывается только один разC:int MPI_Init(int *argc, char ***argv)http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Init.htmlСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 225Обработка ошибок MPI-функцийОпределяется константой MPI_SUCCESSIint error;……error = MPI_Init(&argc, &argv));If (error != MPI_SUCCESS){fprintf (stderr, “ MPI_Init error \n”);return 1;}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 226MPI_Comm_sizeКоличество процессов в коммуникатореРазмер коммуникатораint MPI_Comm_size(MPI_Comm comm, int*size)Результат – число процессовhttp://www-unix.mcs.anl.gov/mpi/www/www3/MPI_Comm_size.htmlСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 227MPI_Comm_rankномер процесса (process rank)Process ID в коммуникаторе Начинается с 0 до (n-1), где n – числопроцессовИспользуется для определения номера процессаотправителя и получателяint MPI_Comm_rank(MPI_Comm comm, int*rank)Результат – номер процессаСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 228Завершение MPI-процессовНикаких вызовов MPI функций послеC:int MPI_Finalize()int MPI_Abort (MPI_Comm_size(MPI_Comm comm, int*errorcode)Если какой-либо из процессов не выполняетMPI_Finalize, программа зависает.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 229Hello, MPI world! (2)#include <stdio.h>#include "mpi.h"int main(int argc, char **argv){int rank, size;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);printf("Hello, MPI world! I am %d of %d\n“,rank,size);MPI_Finalize();return 0; }Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 230Трансляция MPI-программТрансляцияmpicc –o <имя_программы> <имя>.c <опции>Например:mpicc –o hw helloworld.cЗапуск в интерактивном режимеmpirun –np 128 hwСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 231Трансляция MPI-программ на ВСРегаттаТрансляцияmpicc –o hw helloworld.cПостановка в очередь на выполнениеmpisubmit –n 128 hwmpisubmit -helpСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 232mpisubmit -helpСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 233Пример сессии работы на РегаттеСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 234Результат работы hello_worldСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 235Взаимодействие «точка-точка»Самая простая форма обменасообщениемОдин процесс посылает сообщениядругомуНесколько вариантов реализации того,как пересылка и выполнение программысовмещаютсяСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 236Варианты передачи «точка-точка»Синхронные пересылкиАсинхронные передачиСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 237Функции MPI передачи«точка-точка»Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 238Передача сообщений типа «точкаточка»14communicator52destination30sourceВзаимодействие между двумя процессамиПроцесс-отправитель(Source process) посылает сообщениепроцессу-получателю (Destination process )Процесс-получатель принимает сообщениеПередача сообщения происходит в рамках заданногокоммуникатораПроцесс-получатель определяется рангом в коммуникатореСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 239Завершение“Завершение” передачи означает, что буфер в памяти,занятый для передачи, может быть безопасноиспользован для доступа, т.е. Send: переменная, задействованная в передачесообщения, может быть доступна для дальнейшейработы Receive: переменная, получающая значение врезультате передачи, может быть использованаСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 240MPI (блокирующий) SendОбобщенная форма:MPI_SEND (buf, count, datatype, dest, tag, comm)Буфер сообщения описывается как (start, count, datatype).Процесс получатель (dest) задается номером (rank) в заданномкоммуникаторе (comm) .По завершению функции буфер может быть использован.MPI_Send(buf, count, datatype, dest, tag, comm)Address ofDatatype ofMessage tagsend buffereach itemNumber of itemsRank of destination Communicatorto sendprocessСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 241MPI (блокирующий) ReceiveMPI_RECV(buf, count, datatype, source, tag, comm, status)Ожидает, пока не придет соответствующее сообщение с заданнымиsource и tagsource – номер процессаMPI_ANY_SOURCE.status содержит дополнительную информациюв коммуникаторе comm илиMPI_Recv(buf, count, datatype, src, tag, comm, status)StatusMessage tag after operationAddress ofDatatype ofreceive buffereach itemMaximum numberRank of source Communicatorof items to receiveprocessСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 242MPI_Sendint MPI_Send(void *buf,int count, MPI_Datatype datatype,int dest,int tag, MPI_Comm comm)bufcountDatatype desttagcomm-адрес буферачисло пересылаемых элементовMPI datatyperank процесса-получателяопределяемый пользователем параметр,MPI-коммуникаторПример:MPI_Send(data,500,MPI_FLOAT,6,33,MPI_COMM_WORLD)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 2http://www-unix.mcs.anl.gov/mpi/www/www3/MPI_Send.html43MPI_Recvint MPI_Recv(void *buf,int count, MPI_Datatype datatype,int source, inttag, MPI_Comm comm, MPI_Status *status )bufcountDatatype sourcetagcommstatus-адрес буферачисло пересылаемых элементовMPI datatyperank процесса-отправителяопределяемый пользователем параметр,MPI-коммуникатор,статусПример:MPI_Recv(data,500,MPI_FLOAT,6,33,MPI_COMM_WORLD,&stat)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 244Пример: MPI Send/Receive (1)#include <mpi.h>#include <stdio.h>int main(int argc, char *argv[]){int numtasks, rank, dest, source, rc, tag=1;char inmsg, outmsg='X';MPI_Status Stat;MPI_Init (&argc,&argv);MPI_Comm_size (MPI_COMM_WORLD, &numtasks);MPI_Comm_rank (MPI_COMM_WORLD, &rank);if (rank == 0) {dest = 1;rc = MPI_Send (&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);printf("Rank0 sent: %c\n", outmsg);source = 1;rc = MPI_Recv (&inmsg, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD,&Stat); }Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 245Пример: MPI Send/Receive (2)else if (rank == 1) {source = 0;rc = MPI_Recv (&inmsg, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD, &Stat);printf("Rank1 received: %c\n", inmsg);dest = 0;rc = MPI_Send (&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);}MPI_Finalize();}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 246Wildcarding (джокеры)Получатель может использовать джокердля получения сообщения от ЛЮБОГО процессаMPI_ANY_SOURCEДля получения сообщения с ЛЮБЫМ тэгомMPI_ANY_TAGРеальные номер процесса-отправителя и тэг возвращаютсячерез параметр statusСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 247Информация о завершившемся приемесообщенияВозвращается функцией MPI_Recv через параметрstatusСодержит: Source: status.MPI_SOURCE Tag:status.MPI_TAG Count: MPI_Get_countСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 248Полученное сообщениеМожет быть меньшего размера, чем указано в функцииMPI_Recvcount – число реально полученных элементовC:int MPI_Get_count (MPI_Status *status,MPI_Datatype datatype, int *count)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 249Примерint recvd_tag, recvd_from, recvd_count;MPI_Status status;MPI_Recv (..., MPI_ANY_SOURCE, MPI_ANY_TAG, ..., &status )recvd_tag = status.MPI_TAG;recvd_from = status.MPI_SOURCE;MPI_Get_count( &status, datatype, &recvd_count );Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 250Условия успешного взаимодействия«точка-точка»Отправитель должен указать правильный rank получателяПолучатель должен указать верный rank отправителяОдинаковый коммуникаторТэги должны соответствовать друг другуБуфер у процесса-получателя должен быть достаточногообъемаСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 251MPI_Probeint MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status*status)Проверка статуса операции приема сообщения.Параметры аналогичны функции MPI_RecvСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 252Примерif (rank == 0) {// Send size of integers to process 1MPI_Send(buf, size, MPI_INT, 1, 0,MPI_COMM_WORLD);printf("0 sent %d numbers to 1\n",size);} else if (rank == 1) {MPI_Status status;// Probe for an incoming message fromprocessMPI_Probe (0, 0, MPI_COMM_WORLD,&status);MPI_Get_count (&status, MPI_INT,&size);int* number_buf =(int*)malloc(sizeof(int) * size);// Now receive the message with theallocated bufferMPI_Recv (number_buf, size, MPI_INT,0, 0, MPI_COMM_WORLD,MPI_STATUS_IGNORE);printf("1 dynamically received %dnumbers from 0.\n",number_amount);free(number_buf);}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 253.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5137
Авторов
на СтудИзбе
440
Средний доход
с одного платного файла
Обучение Подробнее