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; // пропускаем концевой хвост
};
}
openMP и C++
Скажите пожалуйста, правильно ли распараллеливание кода?
При таком раскладе, на выходе получается неправильные данные.
Цитата: 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];
};
};
}
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];
};
};
}
Вообще, вопросу место в разделе "Студентам", а вам следует хоть немного ознакомиться с теорией.
Кажется вы правы, тут неочем распараллеливать. Запускаю 5-10 потоков, а результат один и тот же.