2016-10-27 3 views
0

놀랍게도 웹에서 cilkplus의 배열 표기법에 기반한 BLAS 구현을 추적 할 수 없습니다. cilkplus는 오늘날의 멀티 코어 워크 스테이션 CPU에서 BLAS 알고리즘을 매우 표현적이고 압축 된 표현으로 결합하여 (이상) 성능을 보장해야하기 때문에 이상합니다. 더 이상한 것은 BLAS/LAPACK이 조밀 한 행렬 계산을위한 사실상의 표준이라고 생각하면 (최소한 사양으로).cilkplus 배열 표기법을 사용하는 blas 구현이 있습니까?

blas/lapack을 개선/확장하려고 시도하는 다른 최신 라이브러리가 있음을 이해합니다. 예를 들어 고유 및 플 렌스를 살펴 보았지만 여전히 cilkplus 버전의 "표준"블래스터 구현.

매우 제한된 스프레드에 따라 달라 지나요?

답변

0

http://parallelbook.com/downloads에는 Cholesky 분해 예제 (gemm, portrf, syrk 및 trsm)의 BLAS 연산에 대한 Cilk Plus 코드 ("BOOK의 코드 예"참조)가 있습니다. 루틴은 템플릿이므로 모든 정밀도로 작동합니다.

더하기 측면에서 Cilk Plus 버전은 좋은 구성 속성을 제공합니다. 즉, 스폰 트리의 개별 부분에서 걱정없이 사용할 수 있습니다. Cilk Plus 알고리즘은 캐시를 잊어 버리는 경향이있는 반면 고도로 조정 된 라이브러리는 캐시 인식을 활용할 수 있기 때문에 깨끗한 컴포지션이 필요하지 않다면 고도로 조정 된 병렬 BLAS 라이브러리와 경쟁하기가 어렵습니다. 예를 들어, 캐시 인식 알고리즘은 동일한 코어에서 여러 스레드를 신중하게 예약하여 동일한 블록에서 작업 할 수 있으므로 메모리 페치 오버 헤드를 줄일 수 있습니다. 각 컴퓨터에 대해 캐시 인식을 얻으려면 많은 작업이 필요하지만 BLAS 작성자는이 작업을 기꺼이 수행합니다.

깨끗한 구성을 방해하는 것은 캐시 인식 ("전 시스템을 소유하고 있습니다"프로그래밍)이므로 둘 다 가질 수는 없습니다.

일부 BLAS 연산의 경우 Cilk Plus의 fork-join 구조는 덜 구조화 된 병렬 처리에 비해 성능을 제한하는 것으로 보입니다. 몇 가지 예를 보려면 http://www.netlib.org/utk/people/JackDongarra/WEB-PAGES/cscads-libtune-09/talk17-knobe.pdf 슬라이드 2를 참조하십시오.

0

예를 들어 gemm을 사용하면 결국 병렬 루틴은 blas (sgemm, dgemm 등) 루틴을 호출하는 것입니다. 이것은 netlib 레퍼런스, atlas, openblas, mkl 일지 모르지만 제안 된 인용문에서는 불투명합니다. 나는 참조 루틴의 실크 플러스 구현의 존재를 묻고있었습니다. 예 :

void dgemm(MATRIX & A, MATRIX & B, MATRIX & C) {  
    #pragma cilk grainsize = 64 
    cilk_for(int i = 1; i <= A.rows; i++) { 
     double *x = &A(i, 1); 
     for (int j = 1; j <= A.cols; j++, x += A.colstride) 
      ROW(C, i) += (*x) * ROW(B, j); 
    } 
} 
관련 문제