Продолжаем Знакомиться С Intel Xeon Phi: «Родной» Код

В последняя статья Знакомство с сопроцессором Intel Xeon Phi было описано с использованием разгрузки — основной код выполняется на хосте, а отдельные блоки выгружаются на сопроцессор.

В этой заметке мы рассмотрим компиляцию и использование «нативного» кода, чтобы разобраться, что это дает и чем грозит. В конце поста будут четыре предложения по использованию Фортрана и примеры программ.

Данная статья не является рекламой или антирекламой какого-либо программного или аппаратного продукта, а лишь описывает личный опыт автора.

Как и в прошлый раз, мы будем рассматривать задачу взаимодействия тел (n-body job).

Мы возьмем решение проблемы с ЦП из предыдущей статьи, а затем, при необходимости, доработаем код для запуска на MIC (далее мы будем называть MIC 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);

Теги: #компилятор Intel #xeon phi #openmp #параллельное программирование #многопоточность #Параллельное программирование
Вместе с данным постом часто просматривают: