Как бы я разделил сетку на 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)
}
}
или оба не правы?