Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
20 / 20 / 4
Регистрация: 13.05.2012
Сообщений: 27
1

Распараллеливание

13.05.2012, 02:46. Просмотров 2008. Ответов 5
Метки нет (Все метки)

Пишу в C++/CLI программу. Потребовалось распараллелить построение фрактала. Вопрос: кто-нибудь когда-нибудь использовал конструкцию Parallel::For? На MSDN примеров нет, только для C# и VB. Мне нужен хотя бы один рабочий пример с этой конструкцией. Я пробовал и через лямбда-функции, и через delegate, но никак не могу задать объект типа Action<int>^ - VS2010 пишет, что ни одна из перегрузок System::Threading::Tasks::Parallel::For не может преобразовать все типы аргументов. Яндекс и Google пользы также не принесли.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2012, 02:46
Ответы с готовыми решениями:

Распараллеливание
Всем добрый вечер. Если кто знает подскажите,мне надо распараллелить перемножение...

Распараллеливание
Здраствуйте. Подскажите как распаралелить функцию поиска минимального элемента в масиве средствами...

Распараллеливание
Написал программу для полного перебора всех возможных n-значных комбинаций состоящих из . Написал 3...

распараллеливание
Скажите, кто-нибудь занимался распараллеливанием в си++? В моих попытках что-либо распараллелить...

5
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
14.05.2012, 09:56 2
Помочь ничем не могу, а вот спросить могу.
Что значит распараллелить? Создать второй поток?

Добавлено через 2 минуты
Распараллеливание
Нашел ссылку в похожих темах. Как я понял, там через WinAPI это все делается. Не разбирался
0
20 / 20 / 4
Регистрация: 13.05.2012
Сообщений: 27
14.05.2012, 20:00  [ТС] 3
Распараллелить - создать несколько потоков, работающих одновременно. Ускоряет выполнение задачи. Меня интересовал метод распараллеливания через Parallel::For. Примеров нигде не мог найти. Однако, удача на моей стороне! Достаточно было спросить преподавателя. Вызов конструкции:
C++
1
 Parallel::For(minValue, maxValue, gcnew System::Action<int>(this, &ClassName::MethodName));
При этом вызываемый метод должен быть описан примерно так:
C++
1
2
3
 void ClassName::MethodName(int v){
//содержимое, зависящее от v
}
И это уже не первый раз, когда на MSDN нет примеров на C++.
1
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
15.05.2012, 10:05 4
Так смотри на C#, если есть. C# и C++ почти одинаковы.
0
20 / 20 / 4
Регистрация: 13.05.2012
Сообщений: 27
15.05.2012, 11:02  [ТС] 5
Ключевое слово - почти. Поверь, я пытался примеры с C# перевести в C++. На MSDN на C# в качестве последнего параметра используют лямбда-функцию. На C++ такое уже не проходит. По крайней мере, у меня не прошло.
0
1075 / 1001 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
17.05.2012, 15:53 6
По-быстрому реализовал умножение матрицы на вектор. Судя по секундомеру я все сделал правильно (4-х ядерная машина). Сколько потоков создаются - не знаю. Наверно 4.
Здесь есть такая особенность. На VS2008 и старее работать не будет т.к. эти студии поддерживают .NET Framework 3.5 или старее. Для использования пространства имен System::Threading::Tasks нужен .NET Framework 4, который поддерживается только VS2010.
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
54
55
56
57
58
59
using namespace System;
using namespace System::Threading::Tasks;
using namespace System::Diagnostics;
 
// ---------------------
ref struct Global
{
    static array<array<double>^>^ A = gcnew array<array<double>^>(1000);
    static array<double>^ x = gcnew array<double>(1000);
    static array<double>^ b = gcnew array<double>(1000);
 
    static Random^ ra = gcnew Random();
    static double random() { return Global::ra->NextDouble()*10; }
 
    static void makearray(int i)
    {
        A[i] = gcnew array<double>(1000);
        x[i] = random();
        for (int j=0; j<1000; j++)
        {
            A[i][j] = random();
        }
    }
 
    static void mulmatrix(int j)
    {
        b[j] = 0;
        for (int i=0; i<1000; i++)
        {
            b[j] += A[i][j] * x[i];
        }
    }
};
 
 
// ---------------------
 
int main(array<System::String ^> ^args)
{
    Action<int>^ ma = gcnew Action<int>(&Global::makearray);
    Action<int>^ mm = gcnew Action<int>(&Global::mulmatrix);
    Stopwatch^ sw = gcnew Stopwatch();
    Parallel::For(0, 1000, ma);
 
    sw->Start();
    for (int j=0; j<1000; j++)
    {
        Global::mulmatrix(j);
    }
    Console::WriteLine("Simple: {0}", sw->ElapsedMilliseconds);
 
    // дальше измеряем
    sw->Reset();
    sw->Start();
    Parallel::For(0, 1000, mm);
    Console::WriteLine("Parallel: {0}", sw->ElapsedMilliseconds);
 
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2012, 15:53

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

Распараллеливание
Уважаемые формумчане! Подскажите, кто-нибудь, пожалуйста, в чем тут может быть ошибка? using...

Распараллеливание цикла while
Здравствуйте, дорогие форумчани! Мучаюсь над проблемой распараллеливания while:gsad: Пишу bbs...

Распараллеливание процессов
Вопросы такие, братцы: 1)на чем лучше писать такую тему как распараллеливание процессов - visual...

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


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

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

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