C# 特定线程数的矩阵乘法
我是多线程领域的新手。目前,我正在尝试实现一个命令行程序,它能够将两个大小相等的矩阵相乘。主要目标是用户可以输入特定数量的线程作为命令行参数,并且乘法任务正是使用这个数量的线程来解决的 我的方法基于以下java实现,它试图解决类似的任务: 我目前的状态如下:C# 特定线程数的矩阵乘法,c#,multithreading,matrix,C#,Multithreading,Matrix,我是多线程领域的新手。目前,我正在尝试实现一个命令行程序,它能够将两个大小相等的矩阵相乘。主要目标是用户可以输入特定数量的线程作为命令行参数,并且乘法任务正是使用这个数量的线程来解决的 我的方法基于以下java实现,它试图解决类似的任务: 我目前的状态如下: using System; using System.Threading; using System.Collections.Generic; using System.Diagnostics; using System.Threading
using System;
using System.Threading;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
class Program
{
static int rows = 16;
static int columns = 16;
static int[] temp = new int[rows*columns];
static int[,] matrixA = new int[rows, columns];
static int[,] matrixB = new int[rows, columns];
static int[,] result = new int[rows, columns];
static Thread[] threadPool;
static void runMultiplication(int index){
for(int i = 0; i < rows; i++){
for(int j = 0; j < columns; j++){
Console.WriteLine();
result[index, i] += matrixA[index, j] * matrixB[j, i];
}
}
}
static void fillMatrix(){
for (int i = 0; i < matrixA.GetLength(0); i++) {
for (int j = 0; j < matrixA.GetLength(1); j++) {
matrixA[i, j] = 1;
matrixB[i, j] = 2;
}
}
}
static void multiplyMatrices(){
threadPool = new Thread[rows];
for(int i = 0; i < rows; i++){
threadPool[i] = new Thread(() => runMultiplication(i));
threadPool[i].Start();
}
for(int i = 0; i < rows; i++){
try{
threadPool[i].Join();
}catch (Exception e){
Console.WriteLine(e.Message);
}
}
}
static void printMatrix(int[,] matrix) {
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
Console.Write(string.Format("{0} ", matrix[i, j]));
}
Console.Write(Environment.NewLine + Environment.NewLine);
}
}
static void Main(String[] args){
fillMatrix();
multiplyMatrices();
printMatrix(result);
}
}
使用系统;
使用系统线程;
使用System.Collections.Generic;
使用系统诊断;
使用System.Threading.Tasks;
班级计划
{
静态int行=16;
静态int列=16;
静态int[]临时=新int[行*列];
静态整数[,]矩阵=新整数[行,列];
静态int[,]matrixB=新int[行,列];
静态int[,]结果=新int[行,列];
静态线程[]线程池;
静态无效运行乘法(整数索引){
对于(int i=0;i运行乘法(i));
线程池[i].Start();
}
对于(int i=0;i
目前我有两个问题:
PS:我知道有些帖子与我的类似,但我的帖子的主要挑战是允许用户设置线程数,然后解决矩阵乘法。如果你是新手,线性代数很难从线程开始。我建议学习first并在C#中实现它 想象一下,如果你只有一个核心,你想执行一个长的计算。操作系统会安排多个线程,以便其中一个线程执行一些工作,然后下一个线程进行轮换,等等。很容易进行思维实验,并找出上下文切换会使问题比单线程版本慢。那里没有真正的并行化 问题是大多数线性代数运算不容易并行化。它们不是相互独立的。线程多于内核不会改善这种情况,可能会使性能更差 您所能做的最好的事情是每个核心一个线程,并像这样对矩阵进行分区
这里有一个想法:在您担心多线程之前,使用您的Matrix类并确保每个操作都可以在单个线程中正常工作。如果您的代码不能为单个线程生成正确的答案,那么担心多线程是没有意义的。开始工作,然后找出如何在多个线程之间划分问题。如果你是新手,线性代数是一个很难从线程开始的地方。我建议学习first并在C#中实现它 想象一下,如果你只有一个核心,你想执行一个长的计算。操作系统会安排多个线程,以便其中一个线程执行一些工作,然后下一个线程进行轮换,等等。很容易进行思维实验,并找出上下文切换会使问题比单线程版本慢。那里没有真正的并行化 问题是大多数线性代数运算不容易并行化。它们不是相互独立的。线程多于内核不会改善这种情况,可能会使性能更差 您所能做的最好的事情是每个核心一个线程,并像这样对矩阵进行分区
这里有一个想法:在您担心多线程之前,使用您的Matrix类并确保每个操作都可以在单个线程中正常工作。如果您的代码不能为单个线程生成正确的答案,那么担心多线程是没有意义的。让它工作起来,然后找出如何在多个线程之间划分问题。i变量在循环的整个生命周期中引用相同的内存位置。检查此答案将解决您的问题:@HenkHolterman确实,Parallel.For()是一种非常舒适的方法,但我必须向用户提供定义特定数量线程的可能性。
I
变量在循环的整个生命周期中引用相同的内存位置。检查此答案将解决您的问题:@HenkHolterman确实,Parallel.For()将是一种非常舒适的方法,但我不得不向用户提供定义特定数量线程的可能性。