2016-12-06 3 views
0

내 목표는 어떤 작업을 수행하는 pthread를 사용하여 다중 스레드 응용 프로그램을 만드는 것입니다. 태스크와 pthreads 자체가 올바르게 작동하기 때문에 화면에 수백 줄의 코드가 넘치지 않게하고 중요한 비트를 보여줍니다. 코드를 테스트하기를 원한다면 사과해야합니다.스레드로 작업을 분할하기 위해 2D 배열의 루프 경계를 설정하는 방법

나는 불행하게도 나는이 그림에 의해 수행하도록하고 같이 스레드 블록에서 일을 할 수있는 2 차원 배열을 분할하는 방법을 알아낼 수 없습니다 : 테스트시

enter image description here

for(int i=(t_id%x)*(height/x); i<(t_id%x + 1)*(height/x); i++){ 
    for(int j=(t_id%x)*(length/x); j<(t_id%x + 1)*(length/x); j++){ 
     //some work is done 
    } 
} 
//t_id -> thread id 
//x -> 2^x = number of threads, so in this ex, x=4 
//i -> y axis, j -> x-axis 
//height -> bound on y-axis of array 
//length -> bound on x-axis of array 

및 이 솔루션은 모든 스레드가 대각선을 따라 배치된다는 단점이 있습니다. 이 문제를 해결할 수있는 솔루션을 구축하는 방법을 알 수 없습니다. 이 문제를 해결하는 방법에 대한 제안을 해주시면 감사하겠습니다.

+0

0에서 I 및 J가 개시 I 및 열 J는 W/M * (J + 1)H/N * (I + 1)W/M * J 범위 데이터로 작업 할 것이다 행의 셀 작업 스레드가 아닌 : //blogs.oracle.com/d/entry/partitioning_work_over_multiple_threads)을 참조하십시오. row_start, row_end 및 col_start, col_end 변수를 만들 때이 함수를 사용합니다. 마지막 섹션에서도 경계 조건을 처리합니다! for 루프를 반복 할 때 row_start에서 row_end로 반복하고 내부 루프에 대해 하나씩 증가 시키지만 열에 대해서는 동일하게 반복하십시오. – KosherBacon

답변

1

그리드를 N 행과 M 열로 분할해야한다고 가정하십시오. I는 [작업 분할 (HTTPS를 사용하고자

+0

도움 주셔서 감사합니다. 그래서 행과 열 사이에 차별화, 내 문제는 (이 예제에서는 0-15) 스레드 ID를 I, J 열 매핑을 연결하는 방법입니다 것 같아요. 열이 (t_id % num_threads)이고 행이 (t_id/num_threads)가 될 것이라고 제안하는 것이 합리적입니까? 내가이 작품을 말할 수있는 것에서부터, 그러나 나는 또한 나의 원래의 해결책에 대해 그렇게 생각하기는 어렵다고 생각했다. –

+0

'num_threads = N * M'입니다. 따라서 '0 <= I GMichael

관련 문제