- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试确定有关我的电脑工作方式的信息,我有一台双核电脑,我正在尝试用我编写的代码来测试它,当每个线程处理时,程序使用线程(在java中)将两个矩阵相乘矩阵行数除以线程数。因此,在两个 1024 X 1024 矩阵上测试我的代码,我得到了这个结果 - (所有结果都是 10 次运行的中位数)1 个线程 - 9.878 秒\\\2 个线程 - 5.944 秒\\\3 个线程 - 5.062 秒\\\4 个线程 - 4.895 秒\\\5 到 1024 个线程,时间在 4.8 到 5.3 秒之间变化\\\.
我想弄清楚为什么前 4 个线程的时间下降幅度较小?难道工作不应该在核心之间平均分配吗?这样 1 个线程 10 秒,2 个线程 5 秒,其余的只需要更长的时间,因为我只有 2 个核心,添加更多线程只是创建更多上下文切换。
我无法理解的第二件事,假设在第四个线程之后,我的电脑只是在线程之间切换,这并没有真正分割工作,而只是切换哪个线程执行某项工作,那么时间不应该急剧增加吗1024个线程只是因为我让它做很多上下文切换?
预先感谢您对此事的任何回复
添加代码 -
/**
* A class representing matrix multiplying threads , implements runnable
* used to test the time difference according to changes in amount of
* threads used in the program !
*
* @author R.G
*/
public class MatrixMultThread implements Runnable{
//Thread fields and constants
private static final String INT_ERROR = "An error has occured during thread join";
private static final String THREAD_COUNT_ERROR = "Invalid number of threads";
static final int MATRIX_ROW = 1024;
static final int MATRIX_COL = 1024;
static final int UPPER_THREAD_LIMIT = MATRIX_ROW;
private int startRow;
private int endRow;
private float[][] target;
private float[][] sourceTwo;
private float[][] sourceOne;
/**
* MatrixMultThread constructor - constructs the threads that handle multiplication.
*
* @param startRow - the row this thread should start calculating from
* @param endRow - the row this thread should stop calculating at (included in calc)
* @param sourceOne - first matrix in the multiplication
* @param sourceTwo - second matrix in the multiplication
* @param target - result matrix
*/
public MatrixMultThread(int startRow, int endRow, float[][] sourceOne, float[][] sourceTwo, float[][] target){
this.startRow = startRow;
this.endRow = endRow;
this.target = target;
this.sourceOne = sourceOne;
this.sourceTwo = sourceTwo;
}
/**
* Thread run method, invoking the actual calculation regarding
* this thread's rows.
*/
public void run() {
int sum = 0;
for(; startRow <= endRow; startRow++){
for(int j = 0; j < MATRIX_COL ; j++){
for(int i = 0; i < MATRIX_ROW ; i++){
sum += sourceOne[startRow][i] * sourceTwo[i][j];
}
target[startRow][j] = sum;
sum = 0;
}
}
}
/**
* A method used for multiplying two matrices by threads.
*
* @param a - first source matrix
* @param b - second source matrix
* @param threadCount - number of threads to use in the multiplication
*/
public static float[][] mult(float[][] a, float[][]b, int threadCount) {
if(threadCount > UPPER_THREAD_LIMIT || threadCount < 1){
System.out.println(THREAD_COUNT_ERROR);
System.exit(1);
}
//Result matrix
float[][] result = new float[MATRIX_ROW][MATRIX_COL];
Thread[] threadList = new Thread[threadCount];
//Creating the threads
int firstRow = 0;
int lastRow = 0;
for (int i = 0; i < threadCount ; i++){
firstRow = i * (MATRIX_ROW / threadCount);
lastRow = ((i + 1) * (MATRIX_ROW / threadCount)) -1 ;
Thread singleThread;
//in case the number does not divide exactly we let the last thread do a bit extra work
//to compensate on the missing few matrix lines.
if((i + 1) == threadCount){
singleThread = new Thread(new MatrixMultThread(firstRow, MATRIX_ROW - 1, a, b, result));
}else{
singleThread = new Thread(new MatrixMultThread(firstRow, lastRow, a, b, result));
}
threadList[i] = singleThread;
singleThread.start();
}
//Join loop
for (int i = 0; i < threadCount ; i++){
try {
threadList[i].join();
} catch (InterruptedException e) {
System.out.println(INT_ERROR);
System.exit(1);
}
}
return result;
}
/**
* Main method of multiplying two matrices using various number of threads
* functionality time is being tested.
*
* @param args.
*/
public static void main(String[] args) {
//Thread number and timers for milliseconds calculation.
int numberOfThreads = 1024;
long startTimer, endTimer;
//Initializing matrices
float[][] a = new float[MATRIX_ROW][MATRIX_COL];
float[][] b = new float[MATRIX_ROW][MATRIX_COL];
for(int i = 0 ; i < MATRIX_ROW ; i++){
for(int j = 0 ; j < MATRIX_COL ; j++){
a[i][j] = (float)(Math.random() * ((100 - 0) + 1)); //Random matrices (values
b[i][j] = (float)(Math.random() * ((100 - 0) + 1)); //between 0 and 100).
}
}
//Timing the multiplication.
startTimer = System.currentTimeMillis();
mult(a, b, numberOfThreads);
endTimer = System.currentTimeMillis();
System.out.println("Matrices multiplied in " + (endTimer - startTimer) + " miliseconds");
}
}
最佳答案
您的程序受 CPU 限制。这意味着它消耗了整个调度程序量子。所以上下文切换开销相对较小:
overhead = ((consumed_quanta + context_switch_time) / consumed_quanta) - 1
在自愿离开 CPU 的进程中,上下文切换开销会更大:例如两个线程不断地在它们之间传递相同的消息(因此一个线程发送消息,而另一个线程读取消息,然后第二个线程将消息发送给第一个线程,依此类推)将产生非常高的上下文切换开销。
SMT(x86 领域的超线程)允许单个核心服务多个线程,就好像它是多个逻辑核心一样。由于 CPU 通常必须等待外部资源(例如:它需要来自缓存的数据),因此允许另一个线程在这些死区期间继续运行可以通过相对较少的额外电路来提高性能(与添加另一个核心相比)。由于 HT 在实际系统中(不是在综合基准测试中)性能改进的典型引用数字约为 10-20%,但是 YMMV:HT 可能会在某些边缘情况下使性能变得更差,并且在不同的边缘情况下可能会带来更显着的改进-案例。
关于java - 影响多线程操作系统的核心数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22476221/
我有几个带有视频和图像的 Bootstrap slider 。在 slider 之外,我想要一个可以转到包含视频的幻灯片的按钮。包含视频的幻灯片的数量因 slider 而异。我想做的是获取幻灯片的数量
我在编写一个查询时遇到了一些问题。 我有一个由文件及其大小(以字节为单位)组成的表。它看起来像这样: FileUrl | FileSize ------------------ xyz.docx |
我有一个带 iframe 的网站和一个带另一个 iframe 的网站,所以它是一个 iframe 内嵌另一个 iframe(都在不同的域上)。那么有没有办法从父div或父主div的url(parent
以下表达式在 JavaScript 中给出了特殊的结果。 typeof (5 + "7") // Gives string typeof (5 - "7") // Gives number 如
我有一个名为“交易”的表,每当有人在我的网站上进行购买时,我都会在其中输入用户 ID、购买类型和金额。 我想向每个用户显示过去 7 天的这些统计信息。 目前,我有这个: $data = array()
我一整天都在努力寻找解决这一挑战的办法。 我有一张 table : id | amount | type | date |
我正在尝试在 10 个数据节点的集群中测试 Map reduce 程序的性能。在此过程中,我使用了 5 个 Reducers,然后是 10 个等等。 我在想增加 reducer 的数量也会使工作完成得
我正在使用 html5 输入 type="number"。我想监视此输入的变化,但是: 因为在支持它的浏览器中 它有旋转控件 我不能只监视 .keyup, 因为我不想等待它失去焦点,所以我不能只监视
我的购物车表格有问题。我创建了一个如下所示的表格: SQL Fiddle 我的问题是我希望能够选择产品 ID,并计算该产品 ID 在表格中重复的次数,以便我可以显示用户在购物车中拥有的商品数量。 寻找
我使用许多包含来显示我网站的一小部分。使用许多 include 是否合适,或者我应该减少它们(尽可能多)。包含函数要多花多少时间? 我的主页加载速度很慢。有什么方法可以让它加载更快。 (我的主页每天在
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: length of array in function argument 我的数组大小是5。例如: arrC
是否有标准的 Python 方法来处理 Python 中的物理单位/数量?我看到了来自不同领域(如物理学或神经科学)的不同模块特定解决方案。但我更愿意使用标准方法而不是“孤岛”解决方案,因为其他人应该
基本上就像标题所说的那样,有没有办法从 JavaScript 程序中查看事件循环中当前存在多少个 promise ?最好在 Deno 上。 最佳答案 Deno v1.26 添加了一个内部 API,可用
我只是想知道大型项目-比如说航空公司的预订系统,它可能有多少类/对象。 对象:客户,飞机,机场,路线,机票,订单。这就是我能想到的。该项目可能是成千上万的代码行,那么是否可能会有更多的类(执行与对象无
如果有办法限制Scala中未处理的 future 数量,我将无法提供资金。 例如下面的代码: import ExecutionContext.Implicits.global for (i
从昨天开始,我一直在努力做到这一点,尽管还没有运气。我找到了解决方案,在我想要完成的事情上总是有细微的差别。 我试图获得所有可能的组合,稍微像这样:combination_k ,但我也希望相同的项目与
我正在尝试更新 1500 个 QuickBooks Online 库存项目的现有数量。我可以从商店中提取 1500 种产品。 这个更新可以做吗?我看到手头没有数量的物品: https://develo
我想与工作人员一起扩展应用程序。 可能有 1 名 worker 或 100 名 worker ,我想无缝扩展它们。 这个想法是使用副本集。然而,由于特定领域的原因,扩展它们的适当方法是让每个工作人员知
Android Studio 有没有办法显示 XML 布局中存在的 View 数量?众所周知,布局应该包含 <=80 个 View ,因此超过此值就会出现此警告,因此告知数量会非常有帮助。 Layou
虽然编码时总是出现有关 IBOutlet 保留计数的相同问题:从 NIB 取消归档对象后保留计数?何时对 IBOutlet 使用 @property?设置时保留还是分配? Mac 和 iPhone 之
我是一名优秀的程序员,十分优秀!