コード例 #1
0
ファイル: MatrixOperation.cs プロジェクト: hj51yc/nn
        private void  MultiplyMatrix(Object obj)
        {
            MultiplyParameter p = (MultiplyParameter)obj;
            int lrowEnd         = p.l_rowEnd;
            int lrowStart       = p.l_rowStart;
            int rcolEnd         = p.r_colEnd;
            int rcolStart       = p.r_colStart;


            int dim = m_leftMatrix.GetLength(1);

            for (int i = lrowStart; i < lrowEnd; ++i)
            {
                for (int j = rcolStart; j < rcolEnd; ++j)
                {
                    double temp = 0.0;
                    for (int k = 0; k < dim; ++k)
                    {
                        temp += m_leftMatrix[i, k] * m_rightMatrix[k, j];
                    }
                    // m_Result[i, j] = Sigmoid(temp); //如果不需要对每一个矩阵元素进行任何操作,则把这个Sigmoid(temp)换成temp直接赋值
                    m_Result[i, j] = temp;
                }
            }
            lock (this){
                ++m_threadFinishedNum;
            }
        }
コード例 #2
0
ファイル: MatrixOperation.cs プロジェクト: hj51yc/nn
        public void MultiplyMatrixMultiThread()
        {
            Array.Clear(m_Result, 0, m_Result.Length);
            int lRow = m_leftMatrix.GetLength(0);
            int lCol = m_leftMatrix.GetLength(1);
            int rRow = m_rightMatrix.GetLength(0);
            int rCol = m_rightMatrix.GetLength(1);

            double[,] R = new double[lRow, rCol];
            bool splitLeftFlag = true;//按照左边的分割(当然这个得看左边矩阵的行数多,还是右边矩阵的列数多了)

            if (rCol > lRow)
            {
                splitLeftFlag = false;
            }
            m_threadFinishedNum = 0;
            int totalThread = 0;

            if (splitLeftFlag)//按行分割左边的矩阵
            {
                if (lRow < THREAD_NUM)
                {
                    totalThread = lRow;
                }
                else
                {
                    totalThread = THREAD_NUM;
                }
                int rowsPerThread = lRow / totalThread;
                int rowsNotAssign = lRow % totalThread;
                int row_start     = 0;
                int row_end       = 0;
                for (int i = 0; i < totalThread; ++i)
                {
                    row_end = row_start + rowsPerThread;
                    if (rowsNotAssign > 0)
                    {
                        ++row_end;
                        --rowsNotAssign;
                    }
                    MultiplyParameter p      = new MultiplyParameter(row_start, row_end, 0, rCol);
                    Thread            thread = new Thread(new ParameterizedThreadStart(MultiplyMatrix));
                    row_start = row_end;
                    thread.Start(p);
                }
            }
            else //按列分割右边的矩阵
            {
                if (rCol < THREAD_NUM)
                {
                    totalThread = rCol;
                }
                else
                {
                    totalThread = THREAD_NUM;
                }
                int colsPerThread = rCol / totalThread;
                int colsNotAssign = rCol % totalThread;
                int col_start     = 0;
                int col_end       = 0;
                for (int i = 0; i < totalThread; ++i)
                {
                    col_end = col_start + colsPerThread;
                    if (colsNotAssign > 0)
                    {
                        ++col_end;
                        --colsNotAssign;
                    }
                    MultiplyParameter p      = new MultiplyParameter(0, lRow, col_start, col_end);
                    Thread            thread = new Thread(new ParameterizedThreadStart(MultiplyMatrix));
                    col_start = col_end;
                    thread.Start(p);
                }
            }
            while (m_threadFinishedNum != totalThread)//直到所有的线程都完成了自己的操作
            {
                Thread.Sleep(10);
            }
        }