Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Concurency, что влияет на скорость  
:(
    Опции темы
sergioK1
Дата 8.3.2013, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Код

package performance;

public class Padding {
   static class Pair{
       volatile long c1;
       long a1,a2,a3,a4,a5,a6,a7,a8;  //???
       volatile long c2;
   }
   static Pair p= new Pair();
   static class Worker implements Runnable {
   private final static int INT=Integer.MAX_VALUE/8;
   private boolean b;
   Worker (boolean b){
        this.b=b;
   }
    @Override
    public void run() {
     long start=System.currentTimeMillis();
     if(b){
         for(int i=0;i<INT;i++){
             p.c1++;
         }
     }
     
     else {
         for(int i=0;i<INT;i++){
             p.c2++;
         }
     }
      long end=System.currentTimeMillis();
      System.out.println(" took " + (end-start)+" "+ p.c1+p.c2);
        
    }
    
    public static void main(String[] args){
        Thread t1=new Thread(new Worker(true));
        Thread t2=new Thread(new Worker(false));        
        t1.start();
        t2.start();
    }
   }
}



вставка лишней строки  long a1,a2,a3,a4,a5,a6,a7,a8; 
увеличивает скорость работы в 2-3 раза,
как это понять ?
PM MAIL   Вверх
jk1
Дата 9.3.2013, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Скорее всего влияет так называемый false sharing. 

Без этой строки с1 и c2 попадают в один и тот же cache line в кэше процессора. Если допустить, что потоки работают на двух физических ядрах, то им придется постоянно заниматься загрузкой/выгрузкой одного и того же cache line в/из кэша, ведь оба потока выполняют интенсивную запись туда.

Если же добавить long a1,a2,a3,a4,a5,a6,a7,a8 между с1 и с2, то с1 и с2 больше не влезут в границы одного cache line'а. Его размер зависит от железа, но в любом случае весьма небольшой. При таком раскладе  оба ядра спокойно будут писать каждый в свой cache line без постоянной необходимости инвалидировать cache line из-за конкурентной записи.

user posted image


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
sergioK1
Дата 9.3.2013, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(jk1 @ 9.3.2013,  12:33)
Скорее всего влияет так называемый false sharing. 

Без этой строки с1 и c2 попадают в один и тот же cache line в кэше процессора. Если допустить, что потоки работают на двух физических ядрах, то им придется постоянно заниматься загрузкой/выгрузкой одного и того же cache line в/из кэша, ведь оба потока выполняют интенсивную запись туда.

Если же добавить long a1,a2,a3,a4,a5,a6,a7,a8 между с1 и с2, то с1 и с2 больше не влезут в границы одного cache line'а. Его размер зависит от железа, но в любом случае весьма небольшой. При таком раскладе  оба ядра спокойно будут писать каждый в свой cache line без постоянной необходимости инвалидировать cache line из-за конкурентной записи.

user posted image

Я честно говоря об этом тоже подумал, и это обьясняет почему скорость в два раза выше ,
но 

Я переписал этот код на С++ таково эффекта нет , хотя процессору должно быть  без разницы,
т,е, логика с двумя кешами от языка не зависит,  есть мысли ?? 


PM MAIL   Вверх
jk1
Дата 10.3.2013, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

хотя процессору должно быть  без разницы


Сильное допущение) Я бы сказал, что от языка и рантайма зависит не меньше, чем от железа:

1. В разных языках по-разному работает аллокатор, выделяющий память. То есть с1 и с2 могут прото не положить рядом
2. В разных языках компилятор и рантайм применяют разные оптимизации. Например можно предвычислить значения переменных на этапе компиляции, сделать inline, etc
3. Стоит также убедиться, что во обоих случаях действительно задействованы оба ядра. В силу особенностей рантайма программа может быть фактически запущена на одном ядре, лишь эмулируя многопоточность быстрыми переключениями
4. Java, в силу особенностей реализации GC, подвержена false sharing гораздо сильнее и чаще, чем этого можно было бы ожидать 


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
sergioK1
Дата 10.3.2013, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(jk1 @ 10.3.2013,  09:38)
Цитата

хотя процессору должно быть  без разницы


Сильное допущение) Я бы сказал, что от языка и рантайма зависит не меньше, чем от железа:

1. В разных языках по-разному работает аллокатор, выделяющий память. То есть с1 и с2 могут прото не положить рядом
2. В разных языках компилятор и рантайм применяют разные оптимизации. Например можно предвычислить значения переменных на этапе компиляции, сделать inline, etc
3. Стоит также убедиться, что во обоих случаях действительно задействованы оба ядра. В силу особенностей рантайма программа может быть фактически запущена на одном ядре, лишь эмулируя многопоточность быстрыми переключениями
4. Java, в силу особенностей реализации GC, подвержена false sharing гораздо сильнее и чаще, чем этого можно было бы ожидать

п 2 , как мне самому запустить оптимизацию аналог gcc -O(1/2/3) желательно через эклипс ,
или наоборот отключить ? (-O0) 

п,3 как это проверить одно ядро задействовано или нет ?? и как на это можно повлиять ?
PM MAIL   Вверх
Romper
Дата 10.3.2013, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 7.11.2012

Репутация: нет
Всего: 1



Цитата(jk1 @  9.3.2013,  13:33 Найти цитируемый пост)
Без этой строки с1 и c2 попадают в один и тот же cache line в кэше процессора. Если допустить, что потоки работают на двух физических ядрах, то им придется постоянно заниматься загрузкой/выгрузкой одного и того же cache line в/из кэша, ведь оба потока выполняют интенсивную запись туда.

Если же добавить long a1,a2,a3,a4,a5,a6,a7,a8 между с1 и с2, то с1 и с2 больше не влезут в границы одного cache line'а. Его размер зависит от железа, но в любом случае весьма небольшой. При таком раскладе  оба ядра спокойно будут писать каждый в свой cache line без постоянной необходимости инвалидировать cache line из-за конкурентной записи.

а где об этом можно почитать?
PM MAIL   Вверх
jk1
Дата 12.3.2013, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

п 2 , как мне самому запустить оптимизацию аналог gcc -O(1/2/3) желательно через эклипс ,
или наоборот отключить ? (-O0) 


Я не настолько хорошо знаю C++, чтобы указать конкретную оптимизацию, которая исправит картинку в этом случае.

Цитата

п,3 как это проверить одно ядро задействовано или нет ?? и как на это можно повлиять ? 


Помониторить загрузку ядер во время выполнения бенчмарка, благо утилит для этого хватает.

Цитата

а где об этом можно почитать? 


тут


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
sergioK1
Дата 13.3.2013, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(jk1 @ 12.3.2013,  20:11)

Цитата

п,3 как это проверить одно ядро задействовано или нет ?? и как на это можно повлиять ? 


Помониторить загрузку ядер во время выполнения бенчмарка, благо утилит для этого хватает.

Например какие пользовал ?? 
PM MAIL   Вверх
jk1
Дата 14.3.2013, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75





--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0917 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.