DgemmThreadCh.java
package org.mklab.sdpj.gpack.blaswrap;
import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;
import org.mklab.sdpj.gpack.blaswrap.DgemmThread.Trans;
/**
* @author koga
* @version $Revision$, 2009/04/24
* @param <RS> 実スカラーの型
* @param <RM> 実行列の型
* @param <CS> 複素スカラーの型
* @param <CM> 複素行列の型
*/
public class DgemmThreadCh<RS extends RealNumericalScalar<RS, RM, CS, CM>, RM extends RealNumericalMatrix<RS, RM, CS, CM>, CS extends ComplexNumericalScalar<RS, RM, CS, CM>, CM extends ComplexNumericalMatrix<RS, RM, CS, CM>> implements Runnable {
/** */
private Trans ch;
/** */
private int m2;
/** */
private int n;
/** */
private int k;
/** */
private int lda;
/** */
private int ldb;
/** */
private int ldc;
/** */
private RS alpha;
/** */
private RS beta;
/** */
private RS[] A;
/** */
private RS[] B;
/** */
private RS[] C;
/**
* 新しく生成された<code>DgemmThreadCh</code>オブジェクトを初期化します。
*
* @param ch ch
* @param m m
* @param n n
* @param k k
* @param alpha alpha
* @param a a
* @param lda lda
* @param b b
* @param ldb ldb
* @param beta beta
* @param c c
* @param ldc ldc
*/
public DgemmThreadCh(Trans ch, int m, int n, int k, RS alpha, RS[] a, int lda, RS[] b, int ldb, RS beta, RS[] c, int ldc) {
this.ch = ch;
this.m2 = m;
this.n = n;
this.k = k;
this.alpha = alpha;
this.beta = beta;
this.A = a;
this.lda = lda;
this.ldb = ldb;
this.ldc = ldc;
this.B = b;
this.C = c;
}
/**
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
// new Dgemm().dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c__, ldc)
for (int i = 0; i < this.m2; i++) {
for (int j = 0; j < this.n; j++) {
RS temp = this.A[0].createZero();
for (int indexk = 0; indexk < this.k; indexk++) {
if (this.ch == Trans.NN) {
temp = temp.add(this.A[i + indexk * this.lda].multiply(this.B[indexk + j * this.ldb]));
} else if (this.ch == Trans.NT) {
temp = temp.add(this.A[i + indexk * this.lda].multiply(this.B[j + indexk * this.ldb]));
} else if (this.ch == Trans.TN) {
temp = temp.add(this.A[indexk + i * this.lda].multiply(this.B[indexk + j * this.ldb]));
} else if (this.ch == Trans.TT) {
temp = temp.add(this.A[indexk + i * this.lda].multiply(this.B[j + indexk * this.ldb]));
}
}
this.C[i + j * this.ldc] = (this.beta.multiply(this.C[i + j * this.ldc])).add(this.alpha.multiply(temp));
}
}
}
}