Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

openMP и C++

57K
27 сентября 2011 года
sqwerty
34 / / 04.01.2011
Скажите пожалуйста, правильно ли распараллеливание кода?
Код:
int i,j,k=0;
        BYTE *R,*G, *B;
        BYTE *p=(BYTE*)m_Bmp.Data;
        DWORD MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;
       
        R=(BYTE*)malloc(MemSize);
        G=(BYTE*)malloc(MemSize);
        B=(BYTE*)malloc(MemSize);
                       
        SHORT Tail=m_Bmp.Tail+(m_Bmp.width-m_Bmp.uwidth)*sizeof(RGB_PIXEL);
        bool FirstTime = true;
               
                #pragma omp parallel
        {
          #pragma omp for firstprivate(j) lastprivate(i) reduction(+: k)
        for (i=0;i<m_Bmp.uheight;i++)
        {
         
            for (j=0;j<m_Bmp.uwidth;j++)
            {
                    B[k]=p[0];
                G[k]=p[1];
                R[k]=p[2];
                p+=sizeof(RGB_PIXEL);
                k++;
            };
       
           
            p+=Tail; // пропускаем концевой хвост
            };
        }
57K
27 сентября 2011 года
sqwerty
34 / / 04.01.2011
При таком раскладе, на выходе получается неправильные данные.
341
27 сентября 2011 года
Der Meister
874 / / 21.12.2007
Цитата: sqwerty
При таком раскладе, на выходе получается неправильные данные.

Вы делаете вообще не то.
Зачем вам свёртка и почему вы в параллельной секции модифицируете данные, объявленные в последовательной секции? Зачем вообще распараллеливать этот код?

Особо не разбирался, но, исходя из предположения, что ваш код работал до того, как вы добавили в него две прагмы, должно быть как-то так:

Код:
DWORD size = m_Bmp.uwidth * m_Bmp.uheight * sizeof(BYTE);

BYTE * R = (BYTE*) malloc(size);
BYTE * G = (BYTE*) malloc(size);
BYTE * B = (BYTE*) malloc(size);
               
BYTE * data = (BYTE*) m_Bmp.Data;
DWORD pitch = m_Bmp.Tail + m_Bmp.width*sizeof(RGB_PIXEL);
       
int i,j;
#pragma omp parallel
{
    #pragma omp for firstprivate(j) lastprivate(i)
    for (i = 0; i < m_Bmp.uheight; i++) {
        for (j = 0; j < m_Bmp.uwidth; j++) {
            int index = i*m_Bmp.uwidth + j;
            BYTE * p = data + i*pitch + j*sizeof(RGB_PIXEL);
           
            B[index]=p[0];
            G[index]=p[1];
            R[index]=p[2];
        };
    };
}
но, повторюсь, нет смысла параллелить копирование.
Вообще, вопросу место в разделе "Студентам", а вам следует хоть немного ознакомиться с теорией.
57K
28 сентября 2011 года
sqwerty
34 / / 04.01.2011
Кажется вы правы, тут неочем распараллеливать. Запускаю 5-10 потоков, а результат один и тот же.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог