Адміністрація вирішила продати даний сайт. За детальною інформацією звертайтесь за адресою: rozrahu@gmail.com

Інформація про навчальний заклад

ВУЗ:
Інші
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2024
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Алгоритми та методи обчислень

Частина тексту файла

Кафедра ЕОМ Звіт з лабораторної роботи № 3 з дисципліни: “Алгоритми та методи обчислень” Варіант № 7 Мета роботи: ознайомитися з використанням потокового графу алгоритму при паралельному програмуванні Вхідні дані с = 565 b = 566 a = 561 Лістинг програми: #include <stdio.h> #include <stdlib.h> #include <x86intrin.h> // Linux #include <math.h> #include <time.h> #define A 565  #define B 566  #define C 561   #pragma GCC push_options #pragma GCC optimize ("no-unroll-loops") #define REPEAT_COUNT 1000000 #define REPEATOR(count, code) \ for (unsigned int indexIteration = (count); indexIteration--;){ code; } #define TWO_VALUES_SELECTOR(variable, firstValue, secondValue) \ (variable) = indexIteration % 2 ? (firstValue) : (secondValue); double getCurrentTime(){ clock_t time = clock(); if (time != (clock_t)-1) { return ((double)time / (double)CLOCKS_PER_SEC); } return 0.; // else } #pragma GCC push_options #pragma GCC target ("no-sse2") // attribute (( target ("no-sse2"))) void run_native(double * const dArr){ double * const dAC = dArr; double * const dA = &dAC[0]; double * const dC = &dAC[1]; double * const dB = &dArr[2]; double * const dResult = &dArr[4]; double * const dX1 = &dResult[1]; double * const dX2 = &dResult[0]; REPEATOR(REPEAT_COUNT, TWO_VALUES_SELECTOR(*dA, 4., A); TWO_VALUES_SELECTOR(*dB, 3., B); TWO_VALUES_SELECTOR(*dC, 1., C); double vD = sqrt((*dB)*(*dB) - 4.*(*dA)*(*dC)); (*dX1) = (-(*dB) + vD) / (2.*(*dA)); (*dX2) = (-(*dB) - vD) / (2.*(*dA)); ) } #pragma GCC pop_options void run_SSE2(double * const dArr){ double * const dAC = dArr; double * const dA = &dAC[0]; double * const dC = &dAC[1]; double * const dB = &dArr[2]; double * const dResult = &dArr[4]; double * const dX1 = &dResult[1]; double * const dX2 = &dResult[0]; m128d r zero_zero, r c_a, r uORb_b, r 2cORbOR2a_2a, r zero_bb, r sqrtDiscriminant_zero, r_result; r zero_zero = _mm_set_pd(0., 0.); // init REPEATOR(REPEAT_COUNT, TWO_VALUES_SELECTOR(*dA, 4., A); TWO_VALUES_SELECTOR(*dB, 3., B); TWO_VALUES_SELECTOR(*dC, 1., C); r c_a = _mm_load_pd(dAC); // r uORb_b = _mm_load_pd1(dB); r uORb_b = _mm_load1_pd(dB); // b b r uORb_b = _mm_unpacklo_pd(r uORb_b, r uORb_b); // (etap 1) r 2cORbOR2a_2a = _mm_add_pd(r c_a, r c_a); // b 2c r_result = _mm_unpackhi_pd(r 2cORbOR2a_2a, r uORb_b); // b 2a r 2cORbOR2a_2a = _mm_unpacklo_pd(r 2cORbOR2a_2a, r uORb_b); // bb 4ac (etap 2) r_result = _mm_mul_pd(r_result, r 2cORbOR2a_2a); r zero_bb = _mm_unpackhi_pd(r_result, r zero_zero); // zero Discriminant (etap 3) r_result = _mm_sub_sd(r zero_bb, r_result); // zero sqrtDiscriminant (etap 4) r_result = _mm_sqrt_sd(r_result, r_result); r sqrtDiscriminant_zero = _mm_shuffle_pd(r_result, r_result, 1); // sqrtDiscriminant -sqrtDiscriminant (etap 5) r_result = _mm_sub_sd(r sqrtDiscriminant_zero, r_result); // (etap 6) r_result = _mm_sub_pd(r_result, r uORb_b); // 2a 2a r 2cORbOR2a_2a = _mm_unpacklo_pd(r 2cORbOR2a_2a, r 2cORbOR2a_2a); // (etap 7) r_result = _mm_div_pd(r_result, r 2cORbOR2a_2a); _mm_store_pd(dResult, r_result); ) } void printResult(char * const title, double * const dArr, unsigned int runTime){ double * const dAC = dArr; double * const dA = &dAC[0]; double * const dC = &dAC[1]; double * const dB = &dArr[2]; double * const dResult = &dArr[4]; double * const dX1 = &dResult[1]; double * const dX2 = &dResult[0]; printf("%s:\r\n", title); printf("%fx^2 + %fx + %f = 0;\r\n", *dA, *dB, *dC); printf("x1 = %1.0f; x2 = %1.0f;\r\n", *dX1, *dX2); printf("run time: %dns\r\n\r\n", runTime); } int main() { double * const dArr = (double *)_mm_malloc(6 * sizeof(double), 16); double * const dAC = dArr; double * const dA = &dAC[0]; double * const dC = &dAC[1]; double * const dB = &dArr[2]; double * const dResult = &dArr[4]; double * const dX1 = &dResult[1]; double * const dX2 = &dResult[0]; double startTime, endTime; // native (only x86, if auto vectorization by compiler is off) startTime = getCurrentTime(); run_native(dArr); e...
Антиботан аватар за замовчуванням

14.10.2018 19:10

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Завантаження файлу

Якщо Ви маєте на своєму комп'ютері файли, пов'язані з навчанням( розрахункові, лабораторні, практичні, контрольні роботи та інше...), і Вам не шкода ними поділитись - то скористайтесь формою для завантаження файлу, попередньо заархівувавши все в архів .rar або .zip розміром до 100мб, і до нього невдовзі отримають доступ студенти всієї України! Ви отримаєте грошову винагороду в кінці місяця, якщо станете одним з трьох переможців!
Стань активним учасником руху antibotan!
Поділись актуальною інформацією,
і отримай привілеї у користуванні архівом! Детальніше

Оголошення від адміністратора

Антиботан аватар за замовчуванням

пропонує роботу

Admin

26.02.2019 12:38

Привіт усім учасникам нашого порталу! Хороші новини - з‘явилась можливість кожному заробити на своїх знаннях та вміннях. Тепер Ви можете продавати свої роботи на сайті заробляючи кошти, рейтинг і довіру користувачів. Потрібно завантажити роботу, вказати ціну і додати один інформативний скріншот з деякими частинами виконаних завдань. Навіть одна якісна і всім необхідна робота може продатися сотні разів. «Головою заробляти» продуктивніше ніж руками! :-)

Новини