OPENLAB-IMAGE PROCESSING
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3)

2 posters

Go down

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Empty Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3)

Bài gửi by jackauk Thu Sep 10, 2015 6:10 pm

Intel Math Kernel Library (Intel MKL) là một thư viện các chương trình con tính toán tối ưu hóa cho khoa học, kỹ thuật, và các ứng dụng tài chính. Chức năng toán học cốt lõi bao gồm BLAS, LAPACK, ScaLAPACK, Tính toán rời rạc, biến đổi Fourier nhanh, và toán vector. Những  trong trình con của MKL có chức năng kiểm soát tối ưu hóa cho các bộ xử lý Intel.

Bộ thư viện này hỗ trợ bộ vi xử lý Intel và có sẵn cho hệ điều hành Windows, Linux và OS X.

Intel MKL có loại chức năng sau đây:

Đại số tuyến tính:  trình con BLAS là làm việc với vector-vector (Level 1), ma trận vector (Level 2) và ma trận-ma trận (Level 3) với kiểu số thực và số phức, đơn hay gấp đôi dữ liệu chính xác. LAPACK giải quyết các vấn đề bao gồm điều chỉnh LU, Cholesky và QR factorizations, eigenvalue và bình phương tối thiểu.
Từ khi MKL  sử dụng các giao diện tiêu chuẩn  cho BLAS và LAPACK, ứng dụng  dùng các thực thi khác có thể  có được hiệu suất tốt hơn trên bộ vi xử lý Intel và hỗ trợ bằng cách tái kết nối với thư viện MKL.
MKL bao gồm một loạt các phép biến đổi nhanh Fourier (FFTs) từ 1 chiều sang đa chiều, phức sang phức , thực sang phức , và thực sang thực với độ dài tùy ý. Ứng dụng được viết FFTW Với nguồn mở có thể được chuyển sang MKL Dễ dàng Với giao diện bằng cách liên kết các thư viện đóng gói được cung cấp như một phần của MKL cho việc di chuyển dễ dàng.
Phiên bản cụm LAPACK và FFT là như là một phần của MKL để tận dụng lợi thế của MPI song song và nút đơn nhất nút song song từ đa luồng.
Các hàm toán học vector bao gồm các nhân tính toán toán học mạnh cho các kiểu dữ liệu chính xác đơn, đôi của số thực và số phức. Có sự tương đồng với các hàm libm từ các thư viện biên dịch nhưng xử lý trên vector hơn là các số vô hướng cho kết quả tốt hơn. Có nhiều điều khiển khác nhau để thiết lập chính xác, và chế độ xử lý số về lỗi để tùy chỉnh các hành vi của các trình con.
Các hàm thống kê bao gồm bộ tạo số ngẫu nhiên và phân phối xác suất. tối ưu cho bộ xử lý đa nhân. Nó cũng bao gồm tính toán chuyên sâu có trong và ngoài của nhân xử lý trình con để tính toán số liệu thống kê cơ bản, ước lượng các phụ thuộc, vv
Các hàm điều chỉnh dữ liệu bao gồm cá phép nội suy (tuyến tính, bậc hai, bậc ba, look-up, liên tục theo từng bước) cho nội suy 1 chiều đó có thể được sử dụng trong phân tích dữ liệu, mô hình hình học và các ứng dụng xấp xỉ bề mặt.


Tải về dùng thử tại : http://www.softpedia.com/get/Programming/Components-Libraries/Intel-Math-Kernel-Library.shtml


Được sửa bởi jackauk ngày Fri Sep 11, 2015 5:27 pm; sửa lần 2.
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Empty Re: Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3)

Bài gửi by jackauk Fri Sep 11, 2015 12:06 pm

Tốc độ xử lý được Intel tối ưu trên từng con chip nên tốc độ của chương trình tính toán là tối đa.
Ví dụ ở đây là nhân 2 ma trận 2000 hàng 200 cột với ma trận 200 hàng và 1000 cột tạo ra ma trận kết quả có 2000 hàng 1000 cột .Số lượng các phép tính toán cơ bản nhất là
2000*1000*200*10(làm 10 lần ) =4000,000,000 phép tính CPU của mình 2 x2Ghz tức là gần với con số 4Ghz
Chương trình có sử dụng MKL hết khoảng 100 ms thì chương trình bình thường hết khoảng 4000ms.

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Minhhoatocdo

Code dùng để so sánh viết trên C++ chứ không phải trên Visual C++ đâu nhé:
Code:
// MKLExperience.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include "stdio.h"
#include "mkl.h"
#define LOOP_COUNT 10
#define LOOPCOUNT 10
#define min(x,y) (((x) < (y)) ? (x) : (y))
int _tmain(int argc, _TCHAR* argv[])
{  double *A, *B, *C;
    int m, n, p, i, r;
    double alpha, beta;
    double s_initial, s_elapsed;

    printf ("\n This example measures performance of Intel(R) MKL function dgemm \n"
            " computing real matrix C=alpha*A*B+beta*C, where A, B, and C \n"
            " are matrices and alpha and beta are double precision scalars\n\n");

    m = 2000, p = 200, n = 1000;
    printf (" Initializing data for matrix multiplication C=A*B for matrix \n"
            " A(%ix%i) and matrix B(%ix%i)\n\n", m, p, p, n);
    alpha = 1.0; beta = 0.0;

    printf (" Allocating memory for matrices aligned on 64-byte boundary for better \n"
            " performance \n\n");
    A = (double *)mkl_malloc( m*p*sizeof( double ), 64 );
    B = (double *)mkl_malloc( p*n*sizeof( double ), 64 );
    C = (double *)mkl_malloc( m*n*sizeof( double ), 64 );
    if (A == NULL || B == NULL || C == NULL) {
        printf( "\n ERROR: Can't allocate memory for matrices. Aborting... \n\n");
        mkl_free(A);
        mkl_free(B);
        mkl_free(C);
        return 1;
    }

    printf (" Intializing matrix data \n\n");
    for (i = 0; i < (m*p); i++) {
        A[i] = (double)(i+1);
    }

    for (i = 0; i < (p*n); i++) {
        B[i] = (double)(-i-1);
    }

    for (i = 0; i < (m*n); i++) {
        C[i] = 0.0;
    }

    printf (" Making the first run of matrix product using Intel(R) MKL dgemm function \n"
            " via CBLAS interface to get stable run time measurements \n\n");
    cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
                m, n, p, alpha, A, p, B, n, beta, C, n);

    printf (" Measuring performance of matrix product using Intel(R) MKL dgemm function \n"
            " via CBLAS interface \n\n");
    s_initial = dsecnd();
    for (r = 0; r < LOOP_COUNT; r++) {
        cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
                    m, n, p, alpha, A, p, B, n, beta, C, n);
    }
    s_elapsed = (dsecnd() - s_initial) / LOOP_COUNT;

    printf (" == Matrix multiplication using Intel(R) MKL dgemm completed == \n"
            " == at %.5f milliseconds == \n\n", (s_elapsed * 1000));
    
    
    if (s_elapsed < 0.9/LOOP_COUNT) {
        s_elapsed=1.0/LOOP_COUNT/s_elapsed;
        i=(int)(s_elapsed*LOOP_COUNT)+1;
        printf(" It is highly recommended to define LOOP_COUNT for this example on your \n"
               " computer as %i to have total execution time about 1 second for reliability \n"
               " of measurements\n\n", i);
    }
   //scanf_s("%d");
   double sum; int j,l,k=200;
       printf (" Making the first run of matrix product using triple nested loop\n"
            " to get stable run time measurements \n\n");
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            sum = 0.0;
            for (l = 0; l < k; l++)
                sum += A[k*i+l] * B[n*l+j];
            C[n*i+j] = sum;
        }
    }
    s_initial = dsecnd();
    for (r = 0; r < LOOP_COUNT; r++) {
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                sum = 0.0;
                for (l = 0; l < k; l++)
                    sum += A[k*i+l] * B[n*l+j];
                C[n*i+j] = sum;
            }
        }
    }
    s_elapsed = (dsecnd() - s_initial) / LOOP_COUNT;
    
    printf (" == Matrix multiplication using triple nested loop completed == \n"
            " == at %.5f milliseconds == \n\n", (s_elapsed * 1000));
    printf (" Deallocating memory \n\n");
    mkl_free(A);
    mkl_free(B);
    mkl_free(C);
    
   printf (" Example completed. \n\n");scanf_s("%d");
  //  return 0;
   
}

jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Empty Re: Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3)

Bài gửi by jackauk Fri Sep 11, 2015 1:50 pm

Khi đề cập xử lý đa luồng thì có so sánh sau:
Nếu cũng làm bài toán nhân ma trận như trên nhưng thay vì sử dụng 2 nhân tốc độ là khoảng 100ms thì một nhân thì là khoảng 140 ms

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Minhhoaxulydanhan

Code bằng C++:

Code:
#include <stdio.h>
#include <stdlib.h>
#include "mkl.h"

/* Consider adjusting LOOP_COUNT based on the performance of your computer */
/* to make sure that total run time is at least 1 second */
#define LOOP_COUNT 10

int main()
{
    double *A, *B, *C;
    int m, n, p, i, j, r, max_threads;
    double alpha, beta;
    double s_initial, s_elapsed;

    printf ("\n This example demonstrates threading impact on computing real matrix product \n"
            " C=alpha*A*B+beta*C using Intel(R) MKL function dgemm, where A, B, and C are \n"
            " matrices and alpha and beta are double precision scalars \n\n");
    
    m = 2000, p = 200, n = 1000;
    printf (" Initializing data for matrix multiplication C=A*B for matrix \n"
            " A(%ix%i) and matrix B(%ix%i)\n\n", m, p, p, n);
    alpha = 1.0; beta = 0.0;
    
    printf (" Allocating memory for matrices aligned on 64-byte boundary for better \n"
            " performance \n\n");
    A = (double *)mkl_malloc( m*p*sizeof( double ), 64 );
    B = (double *)mkl_malloc( p*n*sizeof( double ), 64 );
    C = (double *)mkl_malloc( m*n*sizeof( double ), 64 );
    if (A == NULL || B == NULL || C == NULL) {
        printf( "\n ERROR: Can't allocate memory for matrices. Aborting... \n\n");
        mkl_free(A);
        mkl_free(B);
        mkl_free(C);
        return 1;
    }

    printf (" Intializing matrix data \n\n");
    for (i = 0; i < (m*p); i++) {
        A[i] = (double)(i+1);
    }

    for (i = 0; i < (p*n); i++) {
        B[i] = (double)(-i-1);
    }

    for (i = 0; i < (m*n); i++) {
        C[i] = 0.0;
    }

    printf (" Finding max number of threads Intel(R) MKL can use for parallel runs \n\n");
    max_threads = mkl_get_max_threads();

    printf (" Running Intel(R) MKL from 1 to %i threads \n\n", max_threads);
    for (i = 1; i <= max_threads; i++) {
        for (j = 0; j < (m*n); j++)
            C[j] = 0.0;
        
        printf (" Requesting Intel(R) MKL to use %i thread(s) \n\n", i);
        mkl_set_num_threads(i);

        printf (" Making the first run of matrix product using Intel(R) MKL dgemm function \n"
                " via CBLAS interface to get stable run time measurements \n\n");
        cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
                    m, n, p, alpha, A, p, B, n, beta, C, n);
        
        printf (" Measuring performance of matrix product using Intel(R) MKL dgemm function \n"
                " via CBLAS interface on %i thread(s) \n\n", i);
        s_initial = dsecnd();
        for (r = 0; r < LOOP_COUNT; r++) {
            cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
                        m, n, p, alpha, A, p, B, n, beta, C, n);
        }
        s_elapsed = (dsecnd() - s_initial) / LOOP_COUNT;

        printf (" == Matrix multiplication using Intel(R) MKL dgemm completed ==\n"
                " == at %.5f milliseconds using %d thread(s) ==\n\n", (s_elapsed * 1000), i);
    }
    
    printf (" Deallocating memory \n\n");
    mkl_free(A);
    mkl_free(B);
    mkl_free(C);
    
    if (s_elapsed < 0.9/LOOP_COUNT) {
        s_elapsed=1.0/LOOP_COUNT/s_elapsed;
        i=(int)(s_elapsed*LOOP_COUNT)+1;
        printf(" It is highly recommended to define LOOP_COUNT for this example on your \n"
               " computer as %i to have total execution time about 1 second for reliability \n"
               " of measurements\n\n", i);
    }

    printf (" Example completed. \n\n");
    return 0;
}
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Empty Re: Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3)

Bài gửi by jackauk Mon Sep 14, 2015 3:59 pm

Đây là một chương trình tiêu biểu, lý do chính mà tôi cất công đi tìm kiếm một thư viện chuyên nghiệp cho quá trính tính toán trị riêng, vector riêng. Đoạn chương trình này chỉ là một phần nhỏ trong một chương trình lớn hơn nhưng cũng góp phần nào giúp các bạn hiểu cách làm việc với Intel MKL như thế nào. Nhắc lại với các bạn là Intel MKL phát triển trên nền tảng C/ Fortran ( không phải là C++ hay Visual C++ hay Dot Net).
Mô tả như sau
 LAPACKE_dsyev Example.
  ======================
Chương trình tính toán tất cả các trị riêng và vector riêng của một ma trận đối xứng số thực A
    1.96  -6.49  -0.47  -7.20  -0.65
   -6.49   3.80  -6.39   1.50  -6.34
   -0.47  -6.39   4.17  -1.51   2.67
   -7.20   1.50  -1.51   5.70   1.80
   -0.65  -6.34   2.67   1.80  -7.10

  Mô tả.
  ============
Đoạn chương trình này sẽ tính toán tất cả các trị riêng và (không bắt buộc) các vector riêng của một ma trận số thực đối xứng N x N  tên là A . Các vector riêng v(j) của A thỏa
 
  A*v(j) = lambda(j)*v(j)

  khi mà lambda(j) là một trị riêng của A . Các vector riêng được tính đều trực chuẩn.

  Kết quả của chương trình ví dụ.
  ========================

LAPACKE_dsyev (Chú trọng theo cột, high-level)

Các vector riêng
-11.07  -6.23   0.86   8.87  16.09

Các vetor riêng(chứa theo cột)
 -0.30  -0.61   0.40  -0.37   0.49
 -0.51  -0.29  -0.41  -0.36  -0.61
 -0.08  -0.38  -0.66   0.50   0.40
  0.00  -0.45   0.46   0.62  -0.46
 -0.80   0.45   0.17   0.31   0.16
*/


# include <stdlib.h>
# include <stdio.h>
# include "mkl_lapacke.h"
//Khai báo các thư viện được dùng, ở đây là 2 thư viện xử lý chuỗi và xuất nhập chuẩn của C và thư viện  của intel
/* Auxiliary routines prototypes */
extern void print_matrix( char* desc, MKL_INT m, MKL_INT n, double* a, MKL_INT lda );
//Khai báo việc dùng hàm con trong chương trình
/* Parameters */
# define N 5
# define LDA N
// Khai báo biến tĩnh kiểu tự định nghĩa
/* Main program */
int main() {
       /* Locals */
       MKL_INT n = N, lda = LDA, info;
       /* Local arrays */
       double w[N];
       double a[LDA*N] = {
           1.96,  0.00,  0.00,  0.00,  0.00,
          -6.49,  3.80,  0.00,  0.00,  0.00,
          -0.47, -6.39,  4.17,  0.00,  0.00,
          -7.20,  1.50, -1.51,  5.70,  0.00,
          -0.65, -6.34,  2.67,  1.80, -7.10

       };
       /* Executable statements */
       printf( "LAPACKE_dsyev (column-major, high-level) Example Program Results\n" );
       /* Solve eigenproblem */
       info = LAPACKE_dsyev( LAPACK_COL_MAJOR, 'V', 'U', n, a, lda, w );
/* Hàm LAPACKE_dsyev tính toán với các tham số sau

  • Tham số 1: Mảng hai chiều cần xác định là theo cột chính hay theo hàng chính_ do là yếu tố ảnh hưởng tới các thuật toán tính toán bên trong của hàm thực thi. Với ma trận m x n
       LAPACK_COL_MAJOR: Số lượng phần tử của một cột là m và cột thứ i chứa bên trong bộ nhớ bên phải của cột i-1 , Do đó lda =m
       LAPACK_ROW_MAJOR Số lượng phần tử của một hàng là n và hàng thứ i chứa bên trong bộ nhớ bên phải của hàng i-1 , Do đó lda =n
    Do cách khai báo của chúng ta một mảng A ban đầu 2 chiều được biến thành một mảng một chiều các hàng xếp liền nhau trên một dải.  Điều này ảnh hưởng đến quá trình chia nhỏ mảng ban đầu thành những mảng con để tăng tốc độ tính toán nếu ma trận đầu quá lớn;

  • Tham số 2 : jobz . Đây là công việc mà hàm làm
    "V":  Cả trị riêng và vector riêng cùng được tính
    "N": Chỉ vector riêng được tính
  • Tham số 3: uplo là chỉ việc lữu trữ các ma trận con của A dưới dạng ma trận tam giác trên hay tam giác dưới
    "U" Ma trận tam giác trên
    "L" Ma trận chéo dưới
  • Tham số 4: Bậc n của ma trận
  • Tham số 5: a là một mảng REAL cho hàm dạng ssyev hay DOUBLE PRECISION cho hàm dsyev. Nghĩa là cách tính trị riêng có 2 kiểu và ứng với mỗi kiểu đó thì kiểu dữ liệu đưa vào là tương ứng. (Ma trận A phía trên đã được chọn đúng kiểu rôi). Đây cũng là biến ngõ ra của hàm được viết chồng lên bên trong của routine
  • Tham số 6: Chiều chính của ma trận A , là số nguyên và ít nhất là max của (1,n)
  • Tham số 7: w là ma trận ngõ ra chứa giá trị riêng
  • Biến chiều ra :  info Nếu:
    info = 0,thực thi thành công
    info = -i, tham số thứ i được gán giá trị sai.
    info = i, thuật toán không hội tụ; i xác định số các phần tử của ma trận dạng tam giá trung gian không thể hội tụ về 0.
*/
       /* Check for convergence */
       if( info > 0 ) {
               printf( "The algorithm failed to compute eigenvalues.\n" );
               exit( 1 );
       }
       /* Print eigenvalues */
       print_matrix( "Eigenvalues", 1, n, w, 1 );
       /* Print eigenvectors */
       print_matrix( "Eigenvectors (stored columnwise)", n, n, a, lda );
       exit( 0 );
} /* End of LAPACKE_dsyev Example */

/* Auxiliary routine: printing a matrix */
void print_matrix( char* desc, MKL_INT m, MKL_INT n, double* a, MKL_INT lda ) {
       MKL_INT i, j;
       printf( "\n %s\n", desc );
       for( i = 0; i < m; i++ ) {
               for( j = 0; j < n; j++ ) printf( " %6.2f", a[i+j*lda] );
               printf( "\n" );
       }
}
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Empty Re: Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3)

Bài gửi by jackauk Tue Sep 15, 2015 3:52 pm

Các thủ thuật cần biết để thuận lợi hơn trong quá trình lập trình. Do ngôn ngữ chúng ta quen thuộc là dotNEt rồi C++ nên nhiều thứ ở cấp cao hơn khó thể khai triển ở C

1. Mảng tĩnh trong C++ chuyển về kiểu pointer
array<double,1>^ a2 = gcnew array<double,1>{
           1.96,  0.00,  0.00,  0.00,  0.00,
          -6.49,  3.80,  0.00,  0.00,  0.00,
          -0.47, -6.39,  4.17,  0.00,  0.00,
          -7.20,  1.50, -1.51,  5.70,  0.00,
          -0.65, -6.34,  2.67,  1.80, -7.10
       };
pin_ptr<double> pt = &a2[0];

info = LAPACKE_dsyev( LAPACK_COL_MAJOR, 'V', 'U', n,pt, lda, w );
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Empty Re: Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3)

Bài gửi by titikid Wed Jan 13, 2016 4:37 pm

Hay quá, e đang tìm cách cải thiện tốc độ nhân vô hướng 2 ma trận (inner product) với nhau trên mfc -c++, a có biết về phần này ko?

titikid

Tổng số bài gửi : 1
Điểm danh tiếng : 0
Join date : 03/12/2015

Về Đầu Trang Go down

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Empty Re: Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3)

Bài gửi by jackauk Sat Jan 23, 2016 2:43 pm

titikid đã viết:Hay quá, e đang tìm cách cải thiện tốc độ nhân vô hướng 2 ma trận (inner product) với nhau trên mfc -c++, a có biết về phần này ko?

Bạn dùng thư viện này đi, mình đã post thông số so sánh phía trên rồi đó
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3) Empty Re: Thư viện toán học Intel Math Kernel Library 11.2( mới nhất 11.3)

Bài gửi by Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết