Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 26.12.2012
Сообщений: 17
1

Скалярное произведение векторов и Intel TBB

08.03.2015, 22:31. Просмотров 793. Ответов 2
Метки нет (Все метки)

Добрый день. Требуется распараллелить программу вычисления скалярного произведения векторов с использованием библиотеки Intel Threading Building Blocks.
Реализацию программы нашел в учебном пособии для университета и немного её дописал: http://www.hpcc.unn.ru/file.php?id=373

Заголовочный файл hed.h
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <tbb/tbb.h> // Включает в себя все заголовочные файлы библиотеки
 
using std::cout;
using std::cin;
using std::endl;
using std::cin;
 
 
// Скалярное умножение векторов
double VectorsMultiplication(double *v1, double *v2, int size)
{
    double result = 0;
    for (int i = 0; i < size; i++)
        result += v1[i] * v2[i];
    return result;
}
 
// Функтор
class ScalarMultiplicator
{
private:
    const double *a; // Вектор 1
    const double *b; // Вектор 2
    double c; // Результат
public:
    // Конструктор
    explicit ScalarMultiplicator(double *ta, double *tb) : a(ta), b(tb), c(0) {}
    // Конструктор копирования (расщепления)
    ScalarMultiplicator(const ScalarMultiplicator &m, tbb::split) : a(m.a), b(m.b), c(0) {}
    // Выполняет вычисления
    void operator()(const tbb::blocked_range<int> &r)
    {
        int begin = r.begin();
        int end = r.end();
        c += VectorsMultiplication(&(a[begin]), &(b[begin]), (end - begin)); // Ошибка!
        //for (int i = begin; i < (end - begin); i++)
            //c += a[i] * b[i];
    }
    // Выполняет редукцию
    void join(const ScalarMultiplicator & multiplicator)
    {
        c += multiplicator.c;
    }
    // Возвращает окончательный результат
    double Result()
    {
        return c;
    }
};

Файл example.cpp
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "hed.h"
 
void product_posled(double *vec_1, double *vec_2); // Для проверки: последовательное вычисление скалярного произведения
long size_vec; // Размер вектора
 
int main()
{
    cout << "Please, input size of vector's: ";
    cin >> size_vec;
    cout << endl;
 
    cout << "First vector:" << endl;
    double *ptr_vec_1 = new double[size_vec]; // Создание 1-го вектора
    for (int count = 0; count < size_vec; count++)
    {
        ptr_vec_1[count] = (rand() % 10 + 1) / double((rand() % 10 + 1)); // Заполнение вектора 1 случайными числами с масштабированием от 1 до 10
        cout << ptr_vec_1[count] << " ";
    }
    cout << endl;
    cout << endl;
 
    cout << "Second vector:" << endl;
    double *ptr_vec_2 = new double[size_vec]; // Создание 2-го вектора
    for (int count = 0; count < size_vec; count++)
    {
        ptr_vec_2[count] = (rand() % 10 + 1) / double((rand() % 10 + 1)); // Заполнение вектора 2 случайными числами с масштабированием от 1 до 10
        cout << ptr_vec_2[count] << " ";
    }
    cout << endl;
    cout << endl;
 
    tbb::task_scheduler_init init;
    ScalarMultiplicator s(ptr_vec_1, ptr_vec_2); // Создаем объект класса
    tbb::parallel_reduce(tbb::blocked_range<int>(0, size_vec), s);
    cout << "Result: " << s.Result() << endl;
 
    // Для проверки: последовательное вычисление скалярного произведения
    product_posled(ptr_vec_1, ptr_vec_2);
 
    system("pause");
    return 0;
}
 
// Для проверки: последовательное вычисление скалярного произведения
void product_posled(double *vec_1, double *vec_2)
{
    double sum_all = 0.0;
    for (int i = 0; i < size_vec; i++)
    {
        sum_all += vec_1[i] * vec_2[i];
    }
    cout << "Result (posled): " << sum_all << endl;
}


Однако программа не компилируется, выдавая следующие ошибки:
1 error C2664: "double VectorsMultiplication(double *,double *,int)": невозможно преобразовать аргумент 1 из "const double *" в "double *" c:\users\ser\documents\visual studio 2013\projects\example\example\hed.h 38
2 IntelliSense: аргумент типа "const double *" несовместим с параметром типа "double *" c:\Users\Ser\Documents\Visual Studio 2013\Projects\Example\Example\hed.h 38
3 IntelliSense: аргумент типа "const double *" несовместим с параметром типа "double *" c:\Users\Ser\Documents\Visual Studio 2013\Projects\Example\Example\hed.h 38

Ошибка в вызове функии VectorsMultiplication() из метода operator() класса (строчка 36 файла hed.h)
Чтобы исправить программу, я попробовал перенести код для вычисления скалярного произведения из функции VectorsMultiplication() в метод класса (закомментированные строки 37-38). В этом случае программа компилируется и запускается, однако работает неправильно, выдавая на выходе только произведение элементов векторов под индексами 0.

Как можно исправить ситуацию? Задача простая и алгоритм понятен, а реализовать правильно с использованием tbb не выходит
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2015, 22:31
Ответы с готовыми решениями:

Скалярное произведение векторов
Здравствуйте! Помогите пожалуйста найти ошибки #include &lt;iostream&gt; using namespace std; int...

Скалярное произведение векторов
Объясните, пожалуйста, значение вот этой строки: int scalar(int V1, int V2, int n)

Распараллелить скалярное произведение векторов
Задание - распараллелить скалярное произведение векторов. вектора vec1 и vec2 заполняются не...

Найти скалярное произведение векторов
нужно написать две программы 1) нахождение скалярного произведения векторов ...

2
Модератор
Эксперт С++
10150 / 8499 / 5165
Регистрация: 18.12.2011
Сообщений: 22,736
08.03.2015, 23:01 2
Цитата Сообщение от DESergik Посмотреть сообщение
private:
const double *a; // Вектор 1
const double *b; // Вектор 2
Уберите отсюда const
1
2 / 2 / 0
Регистрация: 26.12.2012
Сообщений: 17
08.03.2015, 23:27  [ТС] 3
zss, благодарю, глупую ошибку просмотрел. Проблема решена.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2015, 23:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

[Геометрия]Скалярное произведение векторов
Добрый день. Есть вот такая задача: Я написал программу, но не уверен верно ли написал. ...

Найти скалярное произведение векторов
Помогите пожалуйста, у самой никак не получается, надо написать программу на С++. Даны координаты...

Найти скалярное произведение векторов
Даны два вектора x, y есть Rn. Найти скалярное произведение векторов.

Скалярное произведение двух векторов
Даны два вектора (одномерных массива), содержащих n вещественных элементов. Найти скалярное ...

Скалярное произведение векторов - комплексное число
Есть задание: Написать программу создания класса для реализации комплексных чисел. Предвидеть...

Вычислить модули и скалярное произведение векторов
Вычислить модули и скалярное произведение двух векторов a и b размерностью n=10. Премного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.