OpenMP самый быстрый способ обновить структуру

0

В моем коде у меня много штук, где у меня двойной цикл, и мне нужно обновлять значения внутри структуры. Проблема в том, что это массив структур, так что происходит много разглашения. Вот пример:

    for(i=0;i<y;i++) {
            for(j=0;j<x;j++) {
                index = i*x+j;
                y1 = (i + 1) % y;
                x1 = (j + 1) % x;
                y2 = (i == 0) ? (i + y - 1) : (i - 1);
                x2 = (j == 0) ? (j + x - 1) : (j - 1);
                str[i *x + j].arr[0]  = c[index].arr[0];
                str[i *x + x1].arr[1] = c[index].arr[1]; 
                str[y1*x + j].arr[2]  = c[index].arr[2]; 
                str[i *x + x2].arr[3] = c[index].arr[3];
                str[y2*x + j].arr[4]  = c[index].arr[4]; 
                str[y1*x + x1].arr[5] = c[index].arr[5];
                str[y1*x + x2].arr[6] = c[index].arr[6];

            }
   }

Я хотел бы ускорить это как можно больше, возможно, используя OpenMP. Я думаю, что было бы много ложного обмена, и я бы тоже не смог использовать указатели. Вы, ребята, знаете эффективный способ ускорить это (и подобные коды)

Теги:
struct
parallel-processing
openmp

1 ответ

0
Лучший ответ

Вы попробовали что-то вроде этого?

#pragma omp parallel for
for(i=0;i<y;i++) {
    y1 = (i + 1) % y;
    y2 = i? i-1 : y-1;
    for(j=0;j<x;j++) {
        index = i*x+j;
        x1 = (j + 1) % x;
        x2 = j? j-1:x-1;
        str[i *x +  j].arr[0] = c[index].arr[0];
        str[i *x + x1].arr[1] = c[index].arr[1]; 
        str[y1*x +  j].arr[2] = c[index].arr[2]; 
        str[i *x + x2].arr[3] = c[index].arr[3];
        str[y2*x +  j].arr[4] = c[index].arr[4]; 
        str[y1*x + x1].arr[5] = c[index].arr[5];
        str[y1*x + x2].arr[6] = c[index].arr[6];

    }
}

Я думаю, что будет не так много ложного обмена, потому что str[] читается только, а c[] кажется хорошо отделенным между потоками (должно быть небольшое перекрытие строк кэша, написанных разными потоками). Просто попробуйте время. Если он хорошо масштабируется, то ложный обмен не является проблемой.

  • 0
    Благодарю. Я получаю почти такое же время с этим изменением. Так что я ничего не могу сделать со структурой, я думаю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню