Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Java на мултипроцессорных компютерах


Автор: _Y_ 13.2.2008, 11:33
Чисто философский вопрос пришел ко мне спросонья. А используется ли Java на мултипроцессорных компютерах и кластерах предназначенных для тяжелых рассчетных задач? Thread вроде самим Создателем предназначена для этого.

ЗЫ: Это чисто теоретическию интерес.

Автор: Hidrag 13.2.2008, 11:41
Похоже нифига не юзает, пишу софт использующий многопоточность, запускаю на двух ядерном проце, в итоге нагружается только одно ядро :(

Вычислить средствами джавы сколько процессоров в системе не проблема (и двухядерный проц определяется как два проца),  а вот как распределить задачи между процессорами, то есть разные потоки на разные процессоры (ядра) пустить?

Автор: mikla 13.2.2008, 11:55
А  это разве не задача операционной системы : распределять потоки ? 

Автор: _Y_ 13.2.2008, 12:40
Цитата(mikla @ 13.2.2008,  11:55)
А  это разве не задача операционной системы : распределять потоки ?

Наверое да, если на PC. Но существуют специальные компьютеры для параллельных вычислений с тысячами процессоров. Я познакомился в общих чертах с одним таким. Но наhttp://www-03.ibm.com/systems/deepcomputing/bluegene/ только C++ и Fortran. Работу между процессорами распределяешь сам програмно. Кроме того существуют кластеры и программы для распределенных вычислений.

Автор: LSD 13.2.2008, 13:18
Цитата(Hidrag @  13.2.2008,  11:41 Найти цитируемый пост)
Похоже нифига не юзает, пишу софт использующий многопоточность, запускаю на двух ядерном проце, в итоге нагружается только одно ядро :(

Значит или у тебя один процесс только грузит ЦП или ты что-то не так делаешь. Запусти:
Код

import static java.lang.Math.pow;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;

public class TaylorSeries implements Runnable
{
  public static final int CPU_NUMBER = 1;

  private static AtomicBoolean running = new AtomicBoolean(true);
  private Random rnd = new Random();

  public void run()
  {
    double result = 1.0;
    while(running.get())
    {
      double newResult = calc(rnd.nextInt(50));
      result = newResult / result;
    }
  }

  private double calc(double x)
  {
    double sum = 0;
    double a, b, c;
    for(int n = 0; n < 100; n++)
    {
      a = pow(-1, n);
      b = n + 1;
      c = pow(3 * x, b);
      sum += a / b * c;
    }
    return sum;
  }

  public static void main(String[] args)
  {
    int threadCount = CPU_NUMBER;
    String s = System.getenv("NUMBER_OF_PROCESSORS");
    if(s != null)
    {
      try
      {
        threadCount = Integer.parseInt(s);
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
    }
    System.out.println("threadCount = " + threadCount);

    Thread[] calcThreads = new Thread[threadCount];
    for(int i = 0; i < threadCount; i++)
    {
      calcThreads[i] = new Thread(new TaylorSeries(), "calc-thread-" + i);
      calcThreads[i].setPriority(Thread.MAX_PRIORITY);
    }

    for(Thread calcThread : calcThreads)
      calcThread.start();

    try
    {
      Thread.sleep(30 * 1000);
    }
    catch(InterruptedException e)
    {
      e.printStackTrace();
    }

    running.set(false);
  }
}

Автор: Sardar 13.2.2008, 13:47
Из-за AtomicBoolean тред чуть ли не в каждой итерации блокироваться будет (жёсткая синхронизация). Шедулер может и не разбросать треды по процессорам что мелкими рывками работают. Замени на обычную boolean (забей на ошибку де-синхронизации в пару миллисекунд), запусти threadCount*10 тредов.

Автор: LSD 13.2.2008, 13:51
Sardar, ну ты бы почитал доку по java.util.concurrent.atomic
Цитата
A small toolkit of classes that support lock-free thread-safe programming on single variables.

или хотя бы запустил этот пример.

За Linux я конечно не скажу, но под Windows он на 30 секунд практически полностью блокирует GUI.

Автор: Sardar 13.2.2008, 14:15
Упс, туплюsmile
Глянул в код, это volatile переменная, дополненная атомарными операциями compareAndSet, lazySet etc. Ты их не используешь, т.е. по сути используешь обычную volatile, в принципе дело вкуса.

Цитата(LSD @  13.2.2008,  12:51 Найти цитируемый пост)
но под Windows он на 30 практически полностью блокирует GUI

У меня всего с 2 тредами полностью блокирует всё, даже менеджер задач в foreground, загрузка обеих ядер 100%.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)