2015-02-02 2 views
1

Мне нужна помощь или некоторые идеи о том, как заставить цикл в этом коде прекратить выполнение, когда коэффициент speedUp опустится до определенного значения. Идея этого метода постоянно запускает все большее количество потоков и выводит коэффициент ускорения из результатов. Коэффициент округления speedUp - это количество ядер, присутствующих на машине. Запуск задачи с четырьмя потоками будет иметь тот же коэффициент ускорения, что и 16-разрядная задача на 4-ядерном компьютере. Я хочу, чтобы у меня не было возможности вручную установить количество потоков для запуска. Когда коэффициент speedUp опустится до значения, я хочу, чтобы программа завершилась. Нет необходимости запускать тест для 8, 16 или 32 потоков, если коэффициент ускорения уже установлен на уровне 2, например.Как получить цикл для остановки

Пример вывода для 4 сердечника машине:

Количество нитей испытания: 1 Скорость до фактор: 1,0

Количество нитей испытания: 2 Ускорение фактор: 1,8473736372646188

Количество течения: 4 Фактор ускорения: 3.9416666666666669

Количество тестируемых нитей: 8 Фактор ускорения: 3.9 750993377483446

Количество нитей испытания: 16 Скорость до фактор: 4,026086956521739

Эта машина имеет: 4 НАПОЛНЕНИЯ

приложение завершило выполнение. СПАСИБО ВАМ

private static void multiCoreTest() { 
 
\t \t // A runnable for the threads 
 
\t \t Counter task = new Counter(1500000000L); 
 
\t \t 
 
\t \t // A variable to store the number of threads to run 
 
\t \t int threadMultiplier = 1; 
 
\t \t 
 
\t \t // A variable to hold the time it takes for a single thread to execute 
 
\t \t double singleThreadTime = ThreadTest.runTime(1, task); 
 

 
\t \t // Calculating speedup factor for a single thread task 
 
\t \t double speedUp = (singleThreadTime * threadMultiplier)/(singleThreadTime); 
 
\t 
 
\t \t // Printing the speed up factor of a single thread 
 
\t \t System.out.println("Number of threads tested: " + threadMultiplier); 
 
\t \t System.out.println("Speed up factor: " + speedUp); 
 

 
\t \t // Testing multiple threads 
 
\t \t while (threadMultiplier < 16) { 
 

 
\t \t \t // Increasing the number of threads by a factor of two 
 
\t \t \t threadMultiplier *= 2; 
 

 
\t \t \t // A variable to hold the time it takes for multiple threads to 
 
\t \t \t // execute 
 
\t \t \t double multiThreadTime = ThreadTest.runTime(threadMultiplier, task); 
 

 
\t \t \t // Calculating speedup factor for multiple thread tests 
 
\t \t \t speedUp = (singleThreadTime * threadMultiplier)/(multiThreadTime); 
 

 
\t \t \t // Message to the user 
 
\t \t \t System.out.println("\n" + "Number of threads tested: " 
 
\t \t \t \t \t + threadMultiplier); 
 
\t \t \t System.out.println("Speed up factor: " + speedUp); 
 

 
\t \t } 
 
\t \t // Print number of cores 
 
\t \t System.out.println("\n" + "THIS MACHINE HAS: " + Math.round(speedUp) 
 
\t \t \t \t + " CORES"); 
 
\t \t System.out.println("\n" 
 
\t \t \t \t + "THE APPLICATION HAS COMPLETED EXECUTION. THANK YOU"); 
 
\t \t // Exiting the system 
 
\t \t System.exit(0); 
 
\t } 
 
}

ответ

2

Test, если новое убыстрение такого же, как и старый:

double oldSpeedUp = 0; 
boolean found = false; 
while(!found && threadMultiplier < 16) { 
    // ... 
    found = Math.round(speedUp) == Math.round(oldSpeedUp); 
    oldSpeedUp = speedUp; 
} 

В качестве примечания, если вы хотите, количество ядер, вы можете звоните:

int cores = Runtime.getRuntime().availableProcessors(); 
+0

Спасибо, я попробую! Да, я знаю, что это простой способ найти ядра ха-ха. Моя параллель в инструкторе хочет, чтобы мы писали программу, которая делает это по-другому. – golferdrew32

+0

BTW «Доступныепроцессоры» - это количество логических процессоров в машине, но не количество ядер, если у вас есть гиперпоточность, и если мы используем нашу привязанность или машина занята, вы получите очень разные результаты. –