В последняя статья Знакомство с сопроцессором Intel Xeon Phi было описано с использованием разгрузки — основной код выполняется на хосте, а отдельные блоки выгружаются на сопроцессор.
В этой заметке мы рассмотрим компиляцию и использование «нативного» кода, чтобы разобраться, что это дает и чем грозит. В конце поста будут четыре предложения по использованию Фортрана и примеры программ.
Данная статья не является рекламой или антирекламой какого-либо программного или аппаратного продукта, а лишь описывает личный опыт автора.
Как и в прошлый раз, мы будем рассматривать задачу взаимодействия тел (n-body job).
Мы возьмем решение проблемы с ЦП из предыдущей статьи, а затем, при необходимости, доработаем код для запуска на MIC (далее мы будем называть MIC Intel Xeon Phi).
Параллельный код с использованием OpenMP
Теги: #компилятор Intel #xeon phi #openmp #параллельное программирование #многопоточность #Параллельное программирование/*---------------------------------------------------------*/ /* N-Body simulation benchmark */ /* written by M.S.Ozhgibesov */ /* 04 July 2015 */ /*---------------------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <time.h> #include <omp.h> #define HOSTLEN 50 int numProc; // Initial conditions void initCoord(float *rA, float *vA, float *fA, \ float initDist, int nBod, int nI); // Forces acting on each body void forces(float *rA, float *fA, int nBod); // Calculate velocities and update coordinates void integration(float *rA, float *vA, float *fA, int nBod); int main(int argc, const char * argv[]) { int const nI = 32; // Number of bodies in X, Y and Z directions int const nBod = nI*nI*nI; // Total Number of bodies int const maxIter = 20; // Total number of iterations (time steps) float const initDist = 1.0; // Initial distance between the bodies float *rA; // Coordinates float *vA; // Velocities float *fA; // Forces int iter; double startTime0, endTime0; char host[HOSTLEN]; rA = (float*)malloc(3*nBod*sizeof(float)); fA = (float*)malloc(3*nBod*sizeof(float)); vA = (float*)malloc(3*nBod*sizeof(float)); gethostname(host, HOSTLEN); printf("Host name: %s\n", host); numProc = omp_get_num_procs(); printf("Available number of processors: %d\n", numProc); // Setup initial conditions initCoord(rA, vA, fA, initDist, nBod, nI); startTime0 = omp_get_wtime(); // Main loop for ( iter = 0; iter < maxIter; iter++ ) { forces(rA, fA, nBod); integration(rA, vA, fA, nBod); } endTime0 = omp_get_wtime(); printf("\nTotal time = .
4f [sec]\n", endTime0 - startTime0); free(rA); free(vA); free(fA);
-
Tesla Roadster: 501 Км Без Подзарядки
19 Oct, 24 -
Штрихи К Бизнес-Модели
19 Oct, 24 -
Столлман Назвал Ubuntu «Шпионским По»
19 Oct, 24 -
Что Мне Подарить Тебе, Мой Дорогой Человек?
19 Oct, 24 -
Box2D: Анатомия Столкновений
19 Oct, 24