2017-03-12 2 views
0

J'ai deux threads et ils lisent tous les deux la même variable statique (un grand objet - un tableau avec 500_000_000 ints).Java variables statiques et le cache

Les deux fils sont épinglés sur un processeur (1 et 2) (affinité cpu) afin de minimiser les tremblements. Savez-vous si les deux threads ralentiront les uns les autres en raison de la variable statique est lu par les deux threads fonctionnant sur différentes unités centrales?

import net.openhft.affinity.AffinityLock; 

public class BigObject { 
    public final int[] array = new int[500_000_000]; 
    public static final BigObject bo_static = new BigObject(); 

    public BigObject() { 
     for(int i = 0; i<array.length; i++){ 
      array[i]=i; 
     } 
    } 

    public static void main(String[] args) { 
     final Boolean useStatic = true; 
     Integer n = 2; 
     for(int i = 0; i<n; i++){ 
      final int k = i;  
      Runnable r = new Runnable() { 
       @Override 
       public void run() { 
        BigObject b; 
        if(useStatic){ 
         b = BigObject.bo_static; 
        } 
        else{ 
         b = new BigObject(); 
        } 
        try (AffinityLock al = AffinityLock.acquireLock()) { 
         while(true){ 
          long nt1 = System.nanoTime(); 
          double sum = 0; 
          for(int i : b.array){ 
           sum+=i; 
          } 
          long nt2 = System.nanoTime(); 
          double dt = (nt2-nt1)*1e-6; 
          System.out.println(k + ": sum " + sum + " " + dt); 
         } 
        } 
       } 
      }; 
      new Thread(r).start(); 
     } 
    } 
} 

Merci

+2

Pouvez-vous nous montrer du code? –

+0

vient d'ajouter du code – EKK

+0

Les tableaux sont toujours alloués sur le tas - peu importe si vous les référencez à partir d'une variable statique ou locale. La lecture de la mémoire sur un processeur ne devrait pas affecter les performances de l'autre (sur un processeur x86 typique) –

Répondre

0

Dans votre cas, il n'y aura pas un ralentissement de le faire multi-thread - puisque vous faites ne lit pas nécessaire d'invalider tout état partagé entre vos unités centrales. En fonction de la charge d'arrière-plan, il peut y avoir des limitations de bus et autres, mais si l'affinité est également définie au niveau de l'OS, il y aura plus de communications inter-CPU et inter-centrales à une pré-lecture facile. manière (puisque vous accédez aux données de manière séquentielle) que les communications mémoire-CPU. La charge d'arrière-plan affecterait également les performances dans un boîtier à un seul thread - il n'est donc pas nécessaire d'argumenter à ce propos. Si tout le système est dédié à votre programme, vous aurez une bande passante mémoire d'environ 20Gb/s sur les processeurs modernes, ce qui est plus que suffisant pour votre jeu de données.