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

С++. OpenMp. Flops. Увеличить скорость перемножение матриц - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Исключения в потоках http://www.cyberforum.ru/cpp-beginners/thread812670.html
Кто читал книгу Параллельное программирование на С++ в действии; у меня возник вопрос из 8 главы. Какая роль в нижеприведенном коде класса join_threads, зачем потоки присоединять в деструкторе при исключении? Программа же все равно будет прервана при первом срабатывании исключения, а те потоки, которые еще работают сами по себе и завершатся при уничтожении вектора потоков threads с...
C++ Последовательность выполнения операций Qt 4.6 кросс-компиляция под Qtopia 4.5. g++. В целом, можно считать чистым с++. book ok; ok = ... true/false; ok = ok && Foo(); Если в ходе выполнения программы ok = false, то функция Foo() может не вызываться (нерегламентированное поведение). В частности: один раз скомпилировал - не запускается; пересобрал - запустилась. Вопрос заключается в следующем: 1) Как выйти из ситуации так,... http://www.cyberforum.ru/cpp-beginners/thread812655.html
C++ fopen, _write, _read с динамическим именем файла
Много перерыл, не нашел. Нужно открывать файл с динамическим названием strcpy_s(cc, "name.par"); FILE *fp=fopen(cc,"r"); Так работает, но если я получаю название файла, предположим через String^ nameT; DateTime^ date; date=DateTime::Now;...
C++ Как переделать программу из Borland C в С++?
Доброго времени суток! Помогите, пожалуйста, переделать программу из Borland C 3.1 в С++. Задача такова: "Написать программу, вычисляющую разность суммы квадратов первой и четвертой цифры и суммы квадратов второй и третьей цифры заданного четырехзначного числа." Код для Borland C 3.1: void main() { int n,y;
C++ Задачи по теме: Обработка символьной и строковой информации http://www.cyberforum.ru/cpp-beginners/thread812639.html
Помогите пожалуйста решить задачи 1. Подсчитать сколько раз в заданном тексте встречается заданный символ.
C++ Простой путь к системным папкам Прошу прощения т.к такие темы были и не раз, но ответ был всегда в стиле: Дофига всякой ненужной всячены для консолек. А мне нужен простой и доступный ответ в стиле: Environment::SystemDirectory->ToString(); //получение сис. папки А не миллион ненужных строк. Для папки временных данных и пути к жестким дискам. З.Ы: Наверника есть что-то как на VB.NET Нужно по такому же типу. подробнее

Показать сообщение отдельно
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
19.03.2013, 14:29     С++. OpenMp. Flops. Увеличить скорость перемножение матриц
Здравствуйте. В универе стоит задача - написать программу для перемножения матриц с максимальной производительностью (flops) для дальнейшего использования с OpenMP. Использую стандартный алгоритм с некоторыми модификациями.
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
void Test2(int n, int threads)
{
    double* result = new double[n*n];
    double* A = new double[n*n];
    double* B = new double[n*n];
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            result[i*n+j] = 0;
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            A[i*n+j] = i+1;
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            B[j*n+i] = 1.0/(j+1);
    int i,j,k;
    double *indres,*indA,*indB;
    long start = clock();
 
#pragma omp parallel num_threads(threads) private(i,j,k) shared(result,A,B)
    {
#pragma omp for schedule(dynamic,50)
    for ( i = 0; i < n; i++)
    {
        indres = result+i*n;
        for ( j = 0; j < n; j++,indres++)
        {
            indB = B+j*n;
            indA = A+i*n;
            for(k =0; k < n; k++,indA++,indB++)
                *(indres) += *(indA)* *(indB);
        }
    }
    }
 
    double time = (clock() - start)*0.001;
 
    cout<<"Time - "<<fixed<<time<<" sec"<<endl;
 
    cout<<"Perfomance - "<<fixed<<2*((double)n/time)*((double)n*(double)n/1000000.0)<<" MegaFlops\n";
    cout<<fixed<<result[0];
    cout<<fixed<<"\t"<<result[n-1]<<endl;
    cout<<fixed<<result[(n-1)*n];
    cout<<fixed<<"\t"<<result[(n-1)*n+n-1]<<endl;
    cout<<"Threads count = "<<threads<<endl;
    
        delete[] result;
        delete[] A;
        delete[] B;
}
Можно ли ещё увеличить производительность, не меняя сам алгоритм на http://ru.wikipedia.org/wiki/Алгоритм_Штрассена
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru