трасировка mpi приложений

Post on 26-Dec-2014

535 Views

Category:

Business

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

Отладка, трассировка и оптимизация приложений

Зачем?• Понять внутреннее устройство программы• Найти узкие места программы [80/20]• Обнаружить ошибки параллельного

программирования

Как будем делать?• Трассировка с помощью ETW (встроено в

HPC Pack)1. mpiexec.exe –tracefile <файл трассы> <mpi приложение>

<параметры>2. Синхронизация3. Конвертация в нужный формат4. Сборка

• Виузализация с помощью Jumpshot

Упражнение• Откройте исправленное решение

DebugMPIContrastStretch• Соберите в режиме Release / 64 bit• Подготовьте к выполнению на кластере:

– Скопируйте в свою папку на кластере приложение и картинку

– Сделайте пробный запуск через Job Manager

Упражнение• В консоли Job Manager выберите:

– Actions Create New Job From Description File выберите Trace.xml

– Перейдите на вкладку Tasks и отредактируйте, указывая актуальные названия файлов и пути

– Запуск

Упражнение• Файл трассы лежит в вашей папке

(расширение clog)• Откройте его с помощью Jumpshot (ярлык

на рабочем столе)

Rank = 0 Rank = 3Rank = 1 Rank = 2

Process 1 Process 2 Process 3 Process 4

CN1 CN2

main mainmainmain

Mpi_send

Mpi_send

Mpi_send

Mpi_receive

Mpi_receiveMpi_receive

Коллективные операции

Упражнение• Найдите в проекте участок, где

производится рассылка размера картинки• Замените его на:int params[2] = {0, 0}; if (myRank == 0) // Master preps data for bcast: {

params[0] = rows; params[1] = cols;

} // EVERYONE participates in broadcast (one sends, rest receive): MPI_Bcast(params, 2, MPI_INT, 0 /*master broadcasts*/, MPI_COMM_WORLD); // EVERYONE now knows the size of the image: rows = params[0]; cols = params[1];

Упражнение• Найдите в проекте участок, где

производится рассылка кусков картинки• Замените его на:

int rowsPerProc = rows / numProcs; int leftOverRows = rows % numProcs; void *sendbuf = (myRank == 0) ? image[leftOverRows] : NULL; void *recvbuf = (myRank == 0) ? chunk[1+leftOverRows] : chunk[1];int count = rowsPerProc * cols; MPI_Scatter(sendbuf, count, MPI_PIXEL_T, recvbuf, count, MPI_PIXEL_T, 0

/*master scatters*/, MPI_COMM_WORLD); if (myRank == 0 && leftOverRows > 0)

memcpy_s(chunk[1], leftOverRows*cols*sizeof(PIXEL_T), image[0], leftOverRows*cols*sizeof(PIXEL_T));

Упражнение• Скомпилируйте• Сделайте трассировку, замерьте время на

распространение картинки

Упражнение• Перепишите функцию CollectImage с

использованием коллективной операции MPI_Scatter

• Описание функции можно найти здесь:http://www.mcs.anl.gov/research/projects/mpi/www/www3/

© 2008 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as

of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.

MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

top related