2015-02-17 19 views
8

Tôi đã làm một số thử nghiệm một năm trước liên quan đến đa lõi với java 7. Đầu tiên tôi thực hiện một số tính toán chỉ trong chủ đề chính (CPU sử dụng cho thấy rằng chỉ có một lõi đã làm tất cả các công việc) và sau đó tôi thực hiện Callable với một ExecutorService dụ. Trong khi chạy tất cả các lõi khi thực hiện công việc.Java 8 tự động sử dụng đa lõi?

Bây giờ, một năm sau, tôi phải triển khai một chút chương trình (sử dụng java 8) để nội suy rất nhiều dữ liệu. Tất cả các công việc được thực hiện trong thread chính (không có Callable và ExecutorService) nhưng khi tôi đang chạy programm, việc sử dụng CPU cho tôi thấy rằng tất cả 4 lõi đều ở mức 98%.

Vì vậy, java 8 tự động phân phối công việc trên tất cả các lõi CPU? Tôi đang bối rối ...

Dưới đây một số mã ...

MapGenerator.java

Region[][] regions = new Region[numOfRegions][numOfRegions]; 

    for(int x = 0; x < regions.length; x++){ 
     for(int z = 0; z < regions[x].length; z++){ 
      newLat = SRTMHandler.getNewLatitude(startLat, z * regionSize * 16); 
      newLon = SRTMHandler.getNewLongitude(startLon, x * regionSize * 16, newLat); 

      regions[x][z] = new Region(x, z, regionSize, newLat, newLon); 
     } 
    } 

Region.java:

private Chunk[] chunks;  

public Region(int x, int z, int size, float startLat, float startLon){ 
    this.chunks = new Chunk[this.size][this.size]; 
    //Init stuff 
    float newLat = this.startLat, newLon = this.startLon; 

    for(int newX = 0; newX < this.size; newX++){ 
     for(int newZ = 0; newZ < this.size; newZ++){ 
      newLat = SRTMHandler.getNewLatitude(this.startLat, newZ * 16); 
      newLon = SRTMHandler.getNewLongitude(this.startLon, newX * 16, newLat); 

      this.chunks[newX][newZ] = new Chunk(this.x * this.size + newX, this.z * this.size + newZ, 16, 900, this, newLat, newLon); 
     } 
    } 
} 

Chunk.java: (SRTMHandler.getHeightForLatLon() thực hiện một số tính toán địa lý và sau đó đọc một giá trị trong mảng byte, không có gì đặc biệt)

public Chunk(int x, int z, int size, int height, Region r, float startLat, float startLon){ 
    this.blocks = new Block[size][size][height]; 
    //Init stuff 

    try { 
     this.calcSurface(); 
     //System.out.println("Finished " + this.toString()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

private void calcSurface() throws IOException{ 
    int x1 = this.x; 
    int x2 = this.x + 16; 
    int z1 = this.z; 
    int z2 = this.z + 16; 
    final int radius = 45; 
    float q11 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, (-1)*radius), SRTMHandler.getNewLongitude(this.startLon, (-1)*radius, this.startLat)); 
    float q12 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, radius), SRTMHandler.getNewLongitude(this.startLon, (-1)*radius, this.startLat)); 
    float q21 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, (-1)*radius), SRTMHandler.getNewLongitude(this.startLon, radius, this.startLon)); 
    float q22 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, radius), SRTMHandler.getNewLongitude(this.startLon, radius, this.startLat)); 

    for(int x = 0; x < this.blocks.length; x++){ 
     for(int z = 0; z < this.blocks[x].length; z++){ 
      float height = Interpolation.biLerp(x, z, q11, q12, q21, q22, x1, x2, z1, z2); 

      this.blocks[x][z][(int)Math.round(height)] = new Block(this.x * this.size + x, this.z * this.size + z, (int)Math.round(height), BlockType.Grass, this); 
     } 
    } 
} 
+1

Bạn có đang sử dụng các tính năng lập trình chức năng của Java 8, cụ thể là các luồng song song không? – erickson

+1

Khi aparapi/parallelforall được cung cấp đầy đủ, thậm chí gpus có thể được sử dụng tự động bằng cách sử dụng mã chỉ java, lambdas. –

+2

Bạn có thể cung cấp một mẫu mã nhỏ không? –

Trả lời

5

Java 8 không tự động phân phối tác phẩm trên tất cả các lõi CPU, trừ khi mã của bạn yêu cầu nó một cách rõ ràng (ví dụ bằng cách sử dụng các luồng song song).

Trong một số trường hợp đặc biệt, trình biên dịch Hotspot sẽ auto-vectorize mã, xem ví dụ JDK-6340864. Tuy nhiên, vector hóa tự động đang sử dụng các hướng dẫn CPU đặc biệt SIMD CPU, không phải nhiều CPU.

Cũng thấy những câu trả lời:

(Lưu ý rằng tôi viết lại câu trả lời, loại bỏ các phần đó đã được sửa chữa bởi các ý kiến)

+0

Trình biên dịch thực hiện một số tự động hóa vectơ hạn chế, đó là một dạng tự động song song. – the8472

+0

Matlab tự động song song khi bạn vận hành trên các ma trận lớn. Nó sử dụng tất cả các lõi khi cần thiết. – rcpinto

1

Tôi có trải qua tình huống này quá. Trong trường hợp của tôi, đó là bộ sưu tập rác thường xuyên gây ra mức sử dụng CPU cao (98%) đáng kể. Như được chỉ ra bởi một số ý kiến ​​theo các câu hỏi ban đầu, java GC sử dụng đa luồng theo mặc định.

Theo ý kiến ​​của tôi, chương trình của bạn không bị ràng buộc CPU. Do đó, nó không có khả năng sử dụng đầy đủ 4 lõi. Mặt khác, khi không có đủ không gian lưu trữ được phân bổ cho chương trình của bạn, GC thường xuyên sẽ dễ dàng cạn kiệt tài nguyên CPU. Sau khi tăng kích thước heap, mọi thứ đều ổn.

Các vấn đề liên quan