Nano Hash - криптовалюты, майнинг, программирование

Почему мой код OpenMP медленнее, чем последовательный код?

я новичок в OpenMp и хотел использовать его в более крупном проекте и сделал это, но безуспешно. Каждая итерация параллельного цикла for должна вычислять последовательную декомпозицию холецкого матрицы, но при параллельном коде время было примерно в 10 раз меньше.

Поэтому я написал небольшой пример кода, чтобы лучше понять openmp. Но почему-то мой код openmp медленнее, чем последовательный код (только без параллельной прагмы). Вот простой код:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ( )
{
clock_t start,ende;
double totalTime;

int i, n = 100000000;
double s = 1.23;
double *x;
double *y;
x = (double *) calloc(n, sizeof(double));
y = (double *) calloc(n, sizeof(double));

for ( i = 0; i < n; i++ ){
    x[i] = ( double ) ( ( i + 1 ) % 17 );
    y[i] = ( double ) ( ( i + 1 ) % 31 );
}

start = clock();

#pragma omp parallel for num_threads(4) private(i)
for ( i = 0; i < n; i++ ){
    x[i] = x[i] + s * y[i];
}

ende = clock();
totalTime = (ende - start)/(double)CLOCKS_PER_SEC;
printf("Zeit: %.10f s\n",totalTime);

free(x);
free(y);

return 0;
}

Мое время составляет 0,625 с с параллельным кодом и 0,328 с с последовательным кодом. По мере того, как я спускаюсь с numthreads(), я получаю лучшие времена. 0,453 с для numthreads(2) и 0,344 с для numthreads(1).

Может ли кто-нибудь помочь мне с небольшим примером кода и почему разложение холецкого не работает?

09.10.2016

  • clock возвращает время ЦП, которое не является временем настенных часов: это (здесь) объединенное время нескольких ядер. Попробуйте сделать свой цикл медленнее (например, добавьте вычисление log или около того для развлечения), чтобы весь процесс занимал около 10 секунд или около того (один поток), и сравните время ваших настенных часов при работе в командной строке. Вы обнаружите, что 4 потока это намного быстрее, но прошедшее время по-прежнему сообщается как медленнее. 10.10.2016
  • Вы не опубликовали свой последовательный код. Если ваш последовательный код, как вы говорите, идентичен, за исключением прагмы OpenMP #parallel ..., то опубликованный вами код OpenMP делает больше, чем последовательный код. 10.10.2016
  • Если приведенных выше объяснений недостаточно, ваш компилятор может выполнять автоматическую векторизацию при отсутствии директивы omp, но не при установке omp parallel for без предложения simd. Этот тип цикла, вероятно, будет замедляться, когда на ядро ​​​​запускается более 1 потока (например, при наличии гиперпоточности). Вы должны раскрыть свои настройки сходства и др. 10.10.2016
  • @Evert Большое спасибо! Это действительно была неправильная функция измерения таймингов в параллельном коде. С другой функцией, упомянутой в вашей связанной ветке, время действительно было быстрее. 10.10.2016

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..