2016-10-26 1 views
0

녹을 모르지만 과학 컴퓨팅의 성능을 조사하여 Julia 및 Fortran과 비교해보고자했습니다. 다음 프로그램을 작성했지만 문제는 MAX이 1022보다 클 때 런타임 세그먼트 화 오류가 발생한다는 것입니다.1022x1022보다 큰 배열에 대한 세그먼트 오류

fn main() { 
    const MAX: usize = 1023; 
    let mut arr2: [[f64; MAX]; MAX] = [[0.0; MAX]; MAX]; 

    let pi: f64 = 3.1415926535; 
    // compute something useless and put in matrix 
    for ii in 0.. MAX { 
     for jj in 0.. MAX { 
      let i = ii as f64; 
      let j = jj as f64; 
      arr2[ii][jj] = ((i + j) * pi * 41.0).sqrt().sin(); 
     } 
    } 

let mut sum0:f64 = 0.0; 

//collapse to scalar like sum(sum(array,1),2) in other langs 
for iii in 0..MAX { 
    let vec1:&[f64] = &arr2[iii][..]; 
    sum0 += vec1.iter().sum(); 
} 
println!("this {}", sum0); 
} 

터미널에서 'Segmentaion fault'오류가 발생하지 않습니다. 나는 우분투 16을 사용하고 www.rustup.rs에 명령과 함께 설치했다. 안정 버전 rustc 1.12.1 (d4f39402a 2016-10-19)입니다.

+0

디버그 모드에서 스택에 만들어지기 때문입니다. 스택이 너무 작아서 스택을 포함 할 수 없습니다. 다음을 참조하십시오 : http://stackoverflow.com/questions/30242770/how-to-allocate-arrays-on-the-heap-in-rust-1-0-beta?noredirect=1&lq=1 – Neikos

+0

디버그를 어떻게 종료합니까? 방법? –

+0

'cargo run - release "를 실행하거나'rustc'의 최적화를 활성화시킬 수 있습니다. – Neikos

답변

6

스택 오버플로 (얼마나 아이러니하고, 어이?).

  1. 은 스택에 큰 배열을 할당 큰 스택 대신 (Vec)
  2. 만 그렇게 힙을 사용하지 마십시오

    이 문제에 대한 두 가지 솔루션이 있습니다.

말할 필요도없이 Vec을 사용하는 것이 훨씬 쉽습니다. 원하는 경우 Vec[f64; MAX]을 사용할 수 있습니다.

스택 사용을 고집하면 to this question을 리디렉션합니다.

+0

감사합니다. Vec를 사용해 보겠습니다. 스택이나 힙인지는 신경 쓰지 않고 배열을 사용하여 선택을했는지 알지 못했습니다. 배열이 제한적이고 정적이기 때문에 배열이 더 빠르다고 가정했습니다. –

+0

@ JonatanÖström : 이론적으로 배열에서 경계 검사를 생략하는 것이 최적화 프로그램에서 더 쉽기 때문에 더 빠를 수 있습니다. 이는 Box {[[f64; MAX]; MAX]>'배열을 힙에 배치하는 것이 유리할 수 있습니다. 그러나 Rust에는 배열을 쌓아 두지 않고 배열을 배치하는 안정적인 방법이 없습니다 (가장 좋은 방법은 다음과 같습니다. 이를 하드 코딩되지 않는 방식으로 수행하는 것). 'Vec '을 사용하면 인덱스 기반 액세스를위한 경계 검사 엘리먼트를 막을 수 있으며, 반복자가 더 잘 최적화됩니다. –

+0

Vec 구조에 대해 좀 더 읽었으니 이제는 일차원적인 것처럼 보입니다. 맞습니까? 이 예제는 그 의미에서 변경 될 수 있지만 큰 다차원 배열을 사용할 수있는 기능은 의도 된 응용 프로그램에서 중요합니다. 그래서 이러한 종류의 기능이 향상되면 Rust를 확인해 보겠습니다. –