Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenMP. Ошибка запуска потоков. 
V
    Опции темы
cutwater
Дата 16.3.2010, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Здравствуйте уважаемые форумчане!

Проблема следующего рода. В наличии 8 ядер, вычисления распараллеливаются при помощи OpenMP всего один цикл при помощи #pragma omp parallel for. Вот только по моим наблюдениям не запускается один поток из восьми, хотя значения цикла равномерно распределяются на 8 частей, из-за чего 1/8 значений остается не покрытой.

На тестовом примере, который не производил ресурсоемких вычислений запускались все 8 потоков.

Далее я протестировал на цикл множестве непокрытых значений, ошибка повторилась.

Цитата

Целевая архитектура: x86_64-unknown-linux-gnu
Параметры конфигурации: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++,ada --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
Модель многопоточности: posix
gcc версия 4.4.3 (GCC) 


Код
Код

#include <stdint.h>
#include <string.h>
#include <stdio.h>

#include <omp.h>

#include "aes.h"

#define VALUE_MAX 0xFFFF
#define EKEY_SIZE 24

int main()
{
    AESContext context;
    aes_init( &context );

    uint8_t cycles[ VALUE_MAX ] = {0};

    #pragma omp parallel for
    for( uint16_t key = 0; key < VALUE_MAX; ++key )
    {
        if( key % 0x100 == 0)
            printf( "%d:%04X\n", omp_get_thread_num(), key );

        uint8_t ekey[ EKEY_SIZE ];
        uint8_t used_texts[ VALUE_MAX ] = {0};

        aes_key_shedule( &key, ekey );

        uint16_t in = 0;
        uint16_t out = 0;
        uint8_t num_cycles = 0;

        for(;;)
        {
            ++num_cycles;
            aes_encrypt( &context, ekey, &in, &out );

            for(;;)
            {
                used_texts[out] = 1;
                if( in == out )
                    break;
                aes_encrypt( &context, ekey, &out, &out);
            }

            int go_next = 1;
            for( uint16_t i = 0; i < VALUE_MAX; ++i )
                if( ! used_texts[i] ){
                    in = i;
                    go_next = 0;
                }

            if( go_next )
                break;
        }

        cycles[key] = num_cycles;

        FILE *fcycles = fopen("cycles.txt", "w");
        for( int i = 0; i < VALUE_MAX; ++i )
        {
            fprintf( fcycles, "K: %04X, C:%d\n", i, (int)cycles[i] );
        }
        fclose( fcycles );

        uint16_t results[0xFF] = {0};

        for( int i = 0; i < VALUE_MAX; ++i )
            results[ cycles[i] ] ++;

        FILE *fresults = fopen("results.txt", "w");
        for( int i = 0; i < 0xFF; ++i )
        {
            if( results[i] )
                fprintf( fresults, "C: %d, K: %d\n", i, (int)results[i] );
        }
        fclose( fresults );
    }
}


и результаты
Код

C: 0, K: 8191
C: 2, K: 24
C: 4, K: 446
C: 6, K: 2798
C: 8, K: 8124
C: 10, K: 13387
C: 12, K: 14275
C: 14, K: 10130
C: 16, K: 5194
C: 18, K: 2157
C: 20, K: 631
C: 22, K: 157
C: 24, K: 16
C: 26, K: 4
C: 28, K: 1


P.S. Поиск по google, багтрекерам GCC и mailists похожих проблем не обнаружил.

Это сообщение отредактировал(а) cutwater - 16.3.2010, 09:00


--------------------
user posted image
PM MAIL   Вверх
cutwater
Дата 16.3.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Проблема решилась, так что придется отвечать самому себе.

Оказывается gcc 4.4.3 поддерживает спецификацию OpenMP 2.5, в которой счетчик цикла может быть только signed integer.

Ошибка всплывает на беззнаковом целом, на граничном значении, в моем случае 0xFFFF.


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.