2012-06-19 3 views
0

C#에서 유한 요소 분석 라이브러리를 구축 중입니다. 분석 할 각 구조에서 요소 수준에 대해 여러 가지 계산을 수행하고 결과를 구조 수준에서 함께 가져와야합니다. 이러한 모든 계산은 많은 요소가있을 때 꽤 많이 일어납니다.가능하면이 코드에서 멀티 스레딩을 구현하는 방법은 무엇입니까?

예를 들어, 요소 강성 행렬 및 전역 강성 행렬에 대한 요소 강성 행렬의 계산이 있습니다.

프로세스가 스레딩을 활용할 수있는 방법이 있습니까?

public class FEStructure 
{ 
    public List<Element> elements = new List<Element>; 
    public Matrix K; 

    Struct() 
    { 
     // Do some stuff not relevant here 
    } 

    public void CalcK() 
    { 
     // Create a Global stiffness matrix (n x n) 
     K = new DenseMatrix(SizeK()); 

     // Process all elements - can it be threaded? 
     foreach (Element e in elements) 
     { 
      // Get the element stiffness matrix and assemble it into K 
      Matrix Ke = e.CalcKe(); 
      Assemble(Ke); 
     } 
    } 

    public void Assemble(Matrix Ke) 
    { 
     // Assembles Ke into K using the element topology 
     // and lot of fields and methods left out. Code 
     // operates on K using syntax similar to: 
     K[i, j] = Ke[k, l]; 
    } 
} 

편집 : e.CalcKe() 통해 소자 매트릭스

계산은 계산 독립적이며 임의의 순서로 수행 될 수있다.

+0

'요소 e'를 개별적으로 계산할 수 있습니까? 아니면 순서대로 계산해야합니까? 서로 관련이 없으며 일종의 진보적 인 상태에 의존하지 않으면'Parallel.ForEach'로 도망 갈 수 있습니다. –

+0

'e.CalcKe();'가 그렇게 오래 걸리나요? – corn3lius

+0

@AdamHouldsworth, 특정 계산 순서가 필요하지 않습니다. – sehlstrom

답변

2

Parallel.ForEach를 사용하여 스레드의 각 루프에 대해 parellize 할 수 있어야합니다.

매트릭스에 대한 할당이 스레드로부터 안전하고 개별 계산이 순서대로 수행되지 않는지 확인해야합니다.

+0

감사합니다. 과제가 스레드로부터 안전함을 보장하려면 어떻게해야합니까? 좋은 본보기를 가르쳐 주시겠습니까? – sehlstrom

+0

Matrix 클래스의 구현에 따라 다릅니다. [i, j]는 요소에 대해 고유합니까? 다른 스레드에서 동시에 두 개의 다른 인덱스에 할당하는 것이 문제가됩니까? 스토리지가 사전 할당되어 있습니까? 아니면 스토리지를 확장해야합니까? 등. – driis

+0

Matrix 클래스는 [Math.NET Numerics 라이브러리] (http://numerics.mathdotnet.com/)의 일부이며 Matrix 객체는 Double 배열 [] [ ]를 사용하여 데이터를 저장 한 다음 다양한 방법으로 선형 대수 연산을 제공합니다. 배열에서 여러 위치를 지정할 수 있다면 Matrix 객체에서도 가능할 것으로 생각됩니다. 일부 요소는 전역 행렬 K에서 같은 위치 [i, j]로 어셈블되지만 모든 것이 아닙니다. 저장소는'K = new DenseMatrix (SizeK()) '를 통해 사전 할당됩니다. – sehlstrom

0
Parallel.ForEach(elements, e => 
{ 
    var eResult = e.CalcKe(); 
    AggregateResults(eResult); 
} 

void AggregateResults(Matix r) 
{ 
    lock(denseMatrix) 
     denseMatix[a,b] = r[k,l]; 
} 
관련 문제