스레드 행렬곱 예제

이 코드는 정말 간단해야한다, 그것의 단지 표준 매트릭스 곱셈, 설명 할 것도 없다 : 두 가지 방법의 실행 시간을 측정하기 위해 나는 각 방법의 1.000 곱셈을 실행했다. 그런 다음 평균 실행 시간을 계산했습니다 : 예를 들어 1000 스레드가 아닌 10 개의 스레드만 사용하는 경우 크기 1000 * 1000의 두 행렬을 곱하기 위해 10 개의 스레드가 아닌 10 개의 스레드를 사용하여 성능이 더 빠릅니다. 안녕하세요 저는 3 * 3 스레드를 사용하여 3 * 3 행렬 곱셈을 구현했습니다. N*N.에 대한 코드를 수정할 수 있습니다. mtrebi/matrix 곱셈-스레딩에서 새 릴리스에 대한 알림을 원하십니까? 행렬에서 직접 작업하는 대신 1차원 배열의 인덱스를 계산하는 것이 더 쉽기 때문입니다. 3×3 행렬과 3 개의 스레드가 있다고 가정하십시오 : 다중 스레딩 구현의 경우 Java의 실행기 프레임 워크를 사용했습니다. 먼저 결과 행렬의 열과 동일한 스레드를 만들었습니다. 비스레드 구현에 비해 큰 행렬 곱셈에 대해 프로그램의 성능이 향상되었습니다. 그러나 내가 직면하고있는 문제는 많은 수의 스레드를 사용하는 프로그램의 성능에 비해 스레드 수가 적은 성능을 높일 때입니다. 행렬(M 행 및 K 열)과 (K 행 및 N 열)의 곱은 M 행과 N 열의 행렬입니다.

스레드를 사용하여 두 개의 N * N 행렬의 곱셈을 계산하는 C 프로그램을 만들고 싶습니다. 여러 스레드를 사용하여 행렬 곱셈을 시작했지만 결과 행렬의 각 셀에 대해 N * N 스레드를 만드는 대신 결과 행렬의 각 행이 동시에 곱셈을 수행하는 N 스레드를 만들고 싶습니다. 다른 스레드에서 계산됩니다. 내 코드는 지금까지 작업의 나머지 부분을 첫 번째 스레드에 넣기로 결정했습니다. 그것은 먼저 만든 하나 이기 때문에, 이것은 그것을 하는 더 합리적인 방법 이어야 한다. 나머지 작업을 끝 인덱스에 추가했습니다. 그런 다음 나머지 작업을 시작 및 끝 인덱스에 오프셋으로 다른 모든 스레드에 추가합니다. 이제 매트릭스가 4×4이지만 3 개의 스레드가 있다고 가정하십시오 : 멋진, 우리는 각 스레드가 무엇을해야하는지 알고 있으므로 실제 곱셈을 수행 하십시오 : 아래는 Java에서 매트릭스 곱셈의 내 코드입니다.

멀티 스레딩없이 매트릭스 곱셈의 구현과 멀티 스레딩을 사용하는 다른 하나는 모두 있습니다. 행렬의 곱셈은 확실히 시간이 걸릴 않습니다. 행렬 곱셈의 시간 복잡성은 법선 행렬 곱셈을 사용하는 O(n^3)입니다. 그리고 스트라센 알고리즘은 그것을 개선하고 그 시간 복잡성은 O (n^(2.8074))입니다. 보시다시피 이 행렬은 1차원 배열로 쉽게 변환할 수 있습니다. 데이터는 동일하며, 데이터를 저장하는 내부 구조를 나타내는 방식만 변경됩니다. 이 아이디어는 다음과 같이 다른 스레드에서 작업을 분할하는 방법을 확인하는 데 유용했습니다. 첫 번째 스레드는 처음 세 개의 곱셈을 수행하고 두 번째 스레드는 더 많은 것을 수행합니다…

그러나 나머지 작업에서는 어떻게 해야 할까요? 글쎄, 실제로 코드는 이전처럼 보이지 않습니다. 이 에지 케이스를 감지하기 위해 if 문을 추가해야합니다: 매우 간단합니다. 우리는 작업의 시작에서 끝까지 이동하고 우리는 1-d 배열에서 2-d로 변환한 다음 행 * col 행렬 곱셈을 수행합니다.