Q: Как использовать доменную композицию на матрице? - PullRequest
0 голосов
/ 29 мая 2019

Как бы я разделил сетку на 4, чтобы разные потоки могли получить к ней доступ? Вопрос не столько в коде, сколько в процессе.

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

Должен ли я просто ограничить использование определенных ячеек с переменными? вот так

#pragma omp parallel shared(New_grid, Current_grid) private(i, j) num_threads(threads)
int thread_num     = omp_get_thread_num();
int thread_start_y = get_starting_point_y(thread_num);
int thread_start_x = get_starting_point_x(thread_num);
for(i = thread_start_y; i < tread_start_y + half_height; ++i){
    for(j = thread_start_x; j < thread_start_x + half_width; ++j){
        New_grid[i][j] = calculate_new_state(Current_grid)
    }
}

или я должен делать копии подрешеток и не присоединяться к ним, пока их не попросят? (очень неполный мини-код, так как подсетям придется совместно использовать память)

int sub_grid[height/2][width/2]; //suppose even numbers
#pragma omp parallel shared(Current_grid) private(i, j, New_sub_grid, thread_num) num_threads(threads)

int thread_num     = omp_get_thread_num();
sub_grid           = copy_subgrid(Current_grid, thread_num);

for(i = 0; i < tread_start_y + half_height; ++i){
    for(j = 0; j < width/2; ++j){
        New_sub_grid[i][j] = calculate_new_state(sub_grid)
    }
}

или оба не правы?

...