Здесь я бы сосредоточился на пользовательском приложении, в котором произошла деградация (нет необходимости в общем обсуждении устойчивости потоков к процессам).
У меня есть приложение MPI на Java, которое решает некоторые проблемы, используя метод итерации. Схематическое представление приложения ниже позволяет назвать его MyProcess (n), где «n» - количество процессов:
double[] myArray = new double[M*K];
for(int iter = 0;iter<iterationCount;++iter)
{
//some communication between processes
//main loop
for(M)
for(K)
{
//linear sequence of arithmetical instructions
}
//some communication between processes
}
Для повышения производительности я решил использовать потоки Java (назовем это MyThreads (n)). Код почти такой же - myArray становится матрицей, где каждая строка содержит массив для соответствующего потока.
double[][] myArray = new double[threadNumber][M*K];
public void run()
{
for(int iter = 0;iter<iterationCount;++iter)
{
//some synchronization primitives
//main loop
for(M)
for(K)
{
//linear sequence of arithmetical instructions
counter++;
}
// some synchronization primitives
}
}
Потоки, созданные и запущенные с использованием Executors.newFixedThreadPool (threadNumber).
Проблема в том, что, хотя для MyProcess (n) мы получили адекватную производительность (n в [1,8]), в случае MyThreads (n) производительность существенно снижается (в моей системе с коэффициентом n).
Аппаратное обеспечение: Intel (R) Xeon (R) CPU X5355 (2 процессора, по 4 ядра на каждом)
Версия Java: 1.5 (с использованием опции d32).
Сначала я подумал, что получил разные рабочие нагрузки на потоки, но нет, переменная «counter» показывает, что число итераций между различными запусками MyThreads (n) (n в [1,8]) одинаково.
И это не ошибка синхронизации, потому что у меня есть временный комментарий ко всем примитивам синхронизации.
Любые предложения / идеи будут оценены.
Спасибо.