Changes

Jump to: navigation, search

Team Lion F2017

2,044 bytes added, 12:15, 5 January 2018
Concurrency
====matmul_0 (Serial)====
<pre>
double matmul_0(const double* a, const double* b, double* c, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
double sum = 0.0;
for (int k = 0; k < n; k++)
sum += a[i * n + k] * b[k * n + j];
c[i * n + j] = sum;
}
}
double diag = 0.0;
for (int i = 0; i < n; i++)
diag += c[i * n + i];
return diag;
}
</pre>
[[File:Conc-01.png]]
====matmul_1 (Serial with j-k loops reversed)====
<pre>
double matmul_1(const double* a, const double* b, double* c, int n) {
for (int i = 0; i < n; i++) {
for (int k = 0; k < n; k++) {
double sum = 0.0;
for (int j = 0; j < n; j++)
sum += a[i * n + k] * b[k * n + j];
c[i * n + k] = sum;
}
}
double diag = 0.0;
for (int i = 0; i < n; i++)
diag += c[i * n + i];
return diag;
}
</pre>
[[File:Conc-11.png]]
====matmul_2 (Cilk Plus with cilk_for)====
<pre>
double matmul_2(const double* a, const double* b, double* c, int n) {
cilk_for (int i = 0; i < n; i++) {
cilk_for (int j = 0; j < n; j++) {
double sum = 0.0;
for(int k = 0; k < n; k++) {
sum += a[i * n + k] * b[k * n + j];
}
c[i * n + j] = sum;
}
}
 
double diag = 0.0;
for (int i = 0; i < n; i++)
diag += c[i * n + i];
return diag;
}
</pre>
[[File:Conc-21.png]]
====matmul_3 (+array notation, reducer)====
<pre>
double matmul_3(const double* a, const double* b, double* c, int n) {
cilk_for(int i = 0; i < n; i++) {
cilk_for(int j = 0; j < n; j++) {
double sum = 0.0;
for (int k = 0; k < n; k++) {
sum += a[i * n + k] * b[k * n + j];
}
c[i * n + j] = sum;
}
}
 
cilk::reducer_opadd <double> diag(0.0);
cilk_for(int i = 0; i < n; i++) {
diag += c[i * n + i];
}
return diag.get_value();
}
</pre>
[[File:Conc-31.png]]
====matmul_4 (+vectorization)====
<pre>
double matmul_4(const double* a, const double* b, double* c, int n) {
cilk_for(int i = 0; i < n; i++) {
cilk_for(int j = 0; j < n; j++) {
double sum = 0.0;
#pragma simd
for (int k = 0; k < n; k++) {
sum += a[i * n + k] * b[k * n + j];
}
c[i * n + j] = sum;
}
}
 
cilk::reducer_opadd <double> diag(0.0);
cilk_for(int i = 0; i < n; i++) {
diag += c[i * n + i];
}
return diag.get_value();
}
</pre>
[[File:Conc-41.png]]
[[File:Conc-42.png]]
 
====Final test with all functions====
 
 
[[File:Conc-51.png]]
[[File:Conc-52.png]]
 
[[File:Conc-53.png]]
====Final test with all functions====
60
edits

Navigation menu