質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

1回答

1149閲覧

[行列積]ブロッキング処理 余分な要素がある場合の計算

toriaezu_NAMA

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2021/05/04 19:30

前提・実現したいこと

【前提】
行列行列積の計算にてブロッキング処理を行い性能を確認しています。
・行列サイズは   NMAX*NMAX
・ブロッキング幅は BLSIZ
・行列の要素は事前に代入済み
・正しいブロッキング幅を事前に考慮しない

【実現したいこと】
NMAXが、ブロッキング幅BLSIZで割り切れないときに正しく計算できるようにする。

発生している問題

ブロッキング処理で適切なブロック幅を指定しない時に発生する、
余分な要素を考慮したアルゴリズムが思いつきません。

例:
下記のような55の行列サイズのとき、22の範囲でブロッキングした場合

[ 0, 1, 2, 3, 4] 
[ 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14]
[15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]

列の方向ならば、
[ 0, 1]
[ 5, 6]

[ 10, 11]
[ 15, 16]

[ 20, 21]
[ a_(6,1), a_(6,2)]

のように行列サイズをオーバーしたブロッキングをしてしまう事になります。
またこの時、事前に考慮していない a_(6,1) a_(6,2) の2つの要素が参照されてしまいます。

思いついた対処方法として
1.行列サイズを超えないブロッキングのみ計算し、余りの要素を別途で計算する。
2.計算結果に影響のでない行列の要素を追加して、ブロッキング幅で割り切れる行列サイズにし計算する。

の2点を思いついたのですが、どのように実装したらいいか検討がつきません。

該当のソースコード

C

1 2#include<stdio.h> 3#include<stdlib.h> 4#include<omp.h> 5#include <time.h> 6#include<math.h> 7 8int main(){ 9 10//中略 11 12#define MAT(i,j) (i)*NMAX+(j) 13 double* a; 14 if ((a = (double*)malloc(sizeof(double) * NMAX * NMAX)) == NULL) { 15 printf("Out of memory, exit."); 16 exit(1); 17 } 18 19//中略 20 21 for (iter = 1; iter <= itermax; iter++) { 22 time1 = omp_get_wtime(); 23 for (i = 0; i < NMAX; i += BLSIZ) { 24 for (k = 0; k < NMAX; k += BLSIZ) { 25 for (j = 0; j < NMAX; j += BLSIZ) { 26 for (ii = i; ii < i + BLSIZ; ii++) { 27 for (kk = k; kk < k + BLSIZ; kk++) { 28 for (jj = j; jj < j + BLSIZ; jj++) { 29 c[MAT(ii, jj)] += a[MAT(ii, kk)] * b[MAT(kk, jj)]; 30 } 31 } 32 } 33 } 34 } 35 } 36 time2 = omp_get_wtime(); 37 } 38 39//以降計測 40 41}

補足情報

出来れば思いついた2点両方を実装し、どちらの方式の方が高性能か検証したいです。
初質問のため、説明不足があった場合は質問してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どのように実装したらいいか検討がつきません。

1.行列サイズを超えないブロッキングのみ計算し、余りの要素を別途で計算する。

ループの判定時に直接BLSIZを使うのではなく、別の変数にBLSIZを代入しておいたものを使っておき最後のループでは残りの数を代入する。

2.計算結果に影響のでない行列の要素を追加して、ブロッキング幅で割り切れる行列サイズにし計算する。

作業用の行列をint(NMAX/(double)BLSIZ+0.5)*int(NMAX/(double)BLSIZ+0.5)でとり、はみ出た部分は0を[入れておく。

でわかりますか。

投稿2021/05/05 09:48

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問