Форум программистов, компьютерный форум CyberForum.ru

OpenMP и SIMD - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перебрать все возможные комбинации трех чисел от нуля до двух http://www.cyberforum.ru/cpp-beginners/thread1751285.html
Здравствуйте, помогите, пожалуйста, разобраться с темой (лучше всего написать код, а то на словах вроде понятно, но код всё же лучше) Задача: перебрать все возможные комбинации трех чисел (тип данных int) от нуля до двух. Примеры комбинаций: 0 0 0 0 0 1 0 1 1 1 1 1 2 1 0 1 0 1 2 2 2
C++ Последний элемент каждой строки заменить средним из отрицательных чисел строки (На С++) Преобразовать исходную матрицу A(MxN) так, чтобы последний элемент каждой строки был заменен среднем арифметическим отрицательных чисел http://www.cyberforum.ru/cpp-beginners/thread1751231.html
C++ Найти строки матрицы, в которых число 3 встречается два раза.
(На С++) Матрицу 10x12 заполнить случайными числами от 0 до 10. Вывести на экран саму матрицу и номера строк, в которых число 3 встречается два раза.
C++ Задача о четырех правильных цифрах
дано четыре правильных цифр
C++ Посчитать количество слов в итоговой строке, начинающихся с гласной буквы http://www.cyberforum.ru/cpp-beginners/thread1751215.html
Две строки инициализировать в программе, третью – ввести с клавиату- ры. Сформировать из них новую строку по следующему алгоритму: сначала со- единить строки в порядке возрастания их длины, затем исключить из нее первое и среднее слова. Посчитать количество слов в итоговой строке, начинающихся с гласной буквы.
C++ Преобразовать строку, удалив пробелы, и разделить слова одиночной "звёздочкой" Дана строка слов, разделенных пробелами. Между словами может быть несколько пробелов, в начале и конце строки также могут быть пробелы. Требуется преобразовать строку так, чтобы в ее начале и конце пробелов не было, а слова были разделены одиночным символом "*" (звездочка). подробнее

Показать сообщение отдельно
Saky
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 33
01.06.2016, 10:38  [ТС]     OpenMP и SIMD
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Общие переменные, в которые что-то присваивается, нужно указывать явно в директиве.
Попробуй так:
убери строчку 8, в 10 - "#pragma omp parallel for", а переменные c, d внеси под первый цикл.
Цитата Сообщение от AlexVRud Посмотреть сообщение
Только сеёчас заметил что у тебя блок съехал
C++
1
2
3
4
5
6
            c = _mm_movehl_ps(c, d);
            d = _mm_add_ps(d, c);
            c = _mm_shuffle_ps(d, d, 1);
            d = _mm_add_ss(d, c);
            _mm_store_ss(&sum, d);
            mas3[i*x + j] = sum;
Добавлено через 4 минуты
Возьми первый вариант, паралелить можно только цикл по i. И как выше сказали, определение временных переменных (c,d,sum) внеси внутрь этого цикла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
double *proizv(double *mas1, double*mas2, int x) {  //произведение после транспонирования
    double *mas3;
    __m128 *a, *b;
    a = (__m128 *)mas1;
    b = (__m128 *)mas2;
    mas3 = (double *)_mm_malloc(x*x*sizeof(double), 16);
#pragma omp parallel for
    for (int i = 0; i < x; i++) {
        float sum; __m128 c, d;
        for (int j = 0; j < x; j++) {
            d = _mm_set_ps1(0);
            for (int k = 0; k < (x / 4); k++) {
                c = _mm_mul_ps(a[i*x / 4 + k], b[j*x / 4 + k]);
                d = _mm_add_ps(d, c);
            }
            c = _mm_movehl_ps(c, d);
            d = _mm_add_ps(d, c);
            c = _mm_shuffle_ps(d, d, 1);
            d = _mm_add_ss(d, c);
            _mm_store_ss(&sum, d);
            mas3[i*x + j] = sum;
        }
    }
    return mas3;
}
Получилось вот это, время выполнения- 1,5 сек.. Посмотрите, пожалуйста, так должно выглядеть?
 
Текущее время: 01:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru