Computação Paralela e Otimização - Vetorização e Multithreading

622 views

Published on

Esta sessão abordará a importância da computação paralela e otimização de código para obter o máximo desempenho tanto em processadores como em co-processadores. Serão abordados tópicos como conceitos de paralelismo, identificação de algoritmos paralelizáveis, importância da vetorização e multithreading

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
622
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Computação Paralela e Otimização - Vetorização e Multithreading

  1. 1. Computação Paralela & Otimização Vetorização e Multithreading Igor José F. Freitas igor.freitas@intel.com
  2. 2. Principais pontos abordados Introdução ao Coprocessador Intel® Xeon® Phi™ Vetorização de código (Atom® ao Xeon® Phi™ ) Multithreading – OpenMP 2
  3. 3. Agenda Introdução Coprocessador Xeon® Phi™ Multithreading em Memória Compartilhada Vetorização Conclusões Dúvidas3
  4. 4. Introdução Necessidade de maior poder computacional em diversos setores – Indústria & Universidades • Previsão do tempo, clima • Imagens médicas • Óleo & Gás • Bioinformática • Simulações em diversas áreas – Aeronáutica, automobilística, mecânica, financeira, telecomunicações, etc. – Aplicações mais rápidas que consomem menos energia • Usuários de Smpartphones, Ultrabooks e Tablets não toleram aplicativos “famintos” por bateria • Otimizar o código leva ao uso ótimo da CPU, portanto, gastando menos recursos do dispositivo4
  5. 5. Introdução Como ganhar desempenho ? – Utilizar 100% a capacidade do seu processador ! Processadores Multi-core e Many-core Unidade de Processamento Vetorial Multithreading Vetorização 5
  6. 6. Introdução SIMD Instruction Processor AVX-512 Intel® Xeon Phi™ Prodruct Family CORE-AVX2 4th Generation Intel® Core™ Processors CORE-AVX-I 3rd Generation Intel® Core™ i7 Processors ; 3rd Generation Intel® Core™ i5 Processors AVX 2nd Generation Intel® Core™ i7 Processors ; 2nd Generation Intel® Core™ i5 Processors ; 2nd Generation Intel® Core™ i3 Processors ; Intel® Xeon® Processor E5 Family ;Intel® Xeon® Processor E3 Family SSE4.2 Previous Generation Intel® Core™ i7 Processors ; Previous Generation Intel® Core™ i5 Processors ; Previous Generation Intel® Core™ i3 Processors ; Intel® Xeon® 55XX series ; Intel® Xeon® 56XX series Intel® Xeon® 75XX series ; Intel® Xeon® Processor E7 Family ATOM_SSE4.2 Intel® Atom™ processors that support Intel® SSE4.2 instructions. SSE4.1 Intel® Xeon® 74XX series ; Quad-Core Intel® Xeon 54XX, 33XX series ; Dual-Core Intel® Xeon 52XX, 31XX series ; Intel® Core™ 2 Extreme 9XXX series ; Intel® Core™ 2 Quad 9XXX series ; Intel® Core™ 2 Duo 8XXX series ; Intel® Core™ 2 Duo E7200 SSSE3 Quad-Core Intel® Xeon® 73XX, 53XX, 32XX series ; Dual-Core Intel® Xeon® 72XX, 53XX, 51XX, 30XX series ; Intel® Core™ 2 Extreme 7XXX, 6XXX series ; Intel® Core™ 2 Quad 6XXX series ; Intel® Core™ 2 Duo 7XXX (except E7200), 6XXX, 5XXX, 4XXX series ; Intel® Core™ 2 Solo 2XXX series ; Intel® Pentium® dual-core processor E2XXX, T23XX series ATOM_SSSE3 Intel® Atom™ processors SSE3 Dual-Core Intel® Xeon® 70XX, 71XX, 50XX Series ; Dual-Core Intel® Xeon® processor (ULV and LV) 1.66, 2.0, 2.16 ; Dual-Core Intel® Xeon® 2.8 ; Intel® Xeon® processors with SSE3 instruction set support Intel® Core™ Duo ; Intel® Core™ Solo ; Intel® Pentium® dual-core processor T21XX, T20XX series ; Intel® Pentium® processor Extreme Edition ; Intel® Pentium® D ; Intel® Pentium® 4 processors with SSE3 instruction set support SSE2 Intel® Xeon® processors ; Intel® Pentium® 4 processors ; Intel® Pentium® M IA32 Intel® Pentium® III Processor ; Intel® Pentium® II Processor ; Intel® Pentium® Processor6
  7. 7. Introdução Processamento Vetorial – Instruções SIMD Histórico das instruções SIMD – Processadores Intel® 7
  8. 8. 8 for (i=0;i<=MAX;i++) c[i]=a[i]+b[i]; + c[i+7] c[i+6] c[i+5] c[i+4] c[i+3] c[i+2] c[i+1] c[i] b[i+7] b[i+6] b[i+5] b[i+4] b[i+3] b[i+2] b[i+1] b[i] a[i+7] a[i+6] a[i+5] a[i+4] a[i+3] a[i+2] a[i+1] a[i] Vector - Uma Instrução - Oito operações matemáticas1 1. Número de operações por instrução varia de acordo com a instrução SIMD utilizada (tamanho da instrução e operando) + C B A Scalar - Uma Instrução - Uma Operação Matemática • O que é e ? • Capacidade de realizar uma operação matemática em dois ou mais elementos ao mesmo tempo. • Por que Vetorizar ? • Ganho substancial em performance ! Introdução
  9. 9. Introdução Multithreading – Número de cores/threads/processador era de uma unidade até 2004 – Atualmente os processadores possuem cada vez mais cores/threads – Ferramentas que facilitam uso de multithreading – Performance não é mais orientada a alta frequência do processador 9
  10. 10. Introdução Computação Paralela & Otimização – Aplicada em: • Clusters de Alto Desempenho (HPC) – Xeon® & Xeon® Phi™ • Microservers (Avotom – Atom ™) – Intel® Atom™ processor C2000 (Avotom ) • Desktops – Intel ® Core ™ • Mobile (Smartphones & Tablets) – Bay Trail ™, Clover Trail+ ™ 10
  11. 11. Do Multi-core para Many-Core Muitas threads e “largos” registradores vetorias Coprocessador Intel® Xeon® Phi™™ (KNC chip) Bottom Servidor com 8 Coprocessadores Intel® Xeon® Phi™ (passive-cooling solution) Coprocessador Intel® Xeon® Phi™ (KNC chip) Coprocessador Intel® Xeon® Phi™ 11
  12. 12. Contectado ao slot PCI-e 57+ cores por die VPU / Core de 64-bits e registradores de 512-bit Cada Core possuie 4 hardware threads Processamento “In order” L2 de 512KB/Core fully coherent (Least Recently Used) 31MB para todos os cores L1 de 32KB Coprocessador Intel® Xeon® Phi™ 12
  13. 13. Portabilidade do código – Xeon® Phi™ é x86 – Aplicações existentes C/C++, Fortran pode ser portadas para Xeon® Phi™ – Xeon® e Xeon® Phi™ suportamo mesmo modelo de paralelismo – Possuem as mesmas Ferramentas de desenvolvimento e execução Coprocessador Intel® Xeon® Phi™ 13
  14. 14. Ferramentas – Compiladores: Intel® C/C++ e Intel® Fortran – Otimização: Intel® VTune Amplifier XE e Intel® Trace Analyzer and Collector (ITAC) – Bibliotecas matemáticas: Intel® Math Kernel Library (MKL) – Bibliotecas de execução paralela: Intel® MPI e Intel® OpenMP Coprocessador Intel® Xeon® Phi™ 14
  15. 15. Arquitetura Xeon® Phi™ Integração com o Host –Perspectiva do Desenvolvedor: • Cada Xeon® Phi™ é um “nó” Linux • Acessível via SSH (Secure Shell Protocol) • Suporte a NFS (Network File Sharing Protocol) –MPSS – MIC Plataform Software Stack • Drivers , Daemons, Comand Line e Ferramentas Gráficas • Boot, Load Linux, Enable node15
  16. 16. Xeon® Multi-Core Centric MIC – Many Core Centric Multi-Core Hosted Aplicações Seriais e Paralelas Offload Aplicações com etapas paralelas Symmetric Load Balance Many-Core Hosted Aplicações Massivamente Paralelas • Computação Heterogênea Coprocessador Intel® Xeon® Phi™ 16
  17. 17. Arquitetura Xeon® Phi™ System Level Code Linux/Windows Host PCI-e Bus Windows/ Linux OS MPSS Offload Aplication SSH Intel® Xeon® Phi™ Coprocessor System Level Code PCI-e Bus Linux uOS Coprocessor Communication and app- launching support Native Aplication Offload Aplication SSH Session MIC Plataform Software Stack 17
  18. 18. Multithreading em Memória Compartilhada 18
  19. 19. 19 Multithreading em Memória Compartilhada Memória compartilhada  Todos os processos compartilham um único espaço de memória  Comunicação através de escrita e leitura de variáveis compartilhadas  SMPs – Symmetric Multiprocessors  Fácil programação  Overhead na comunicação entre processador e memória
  20. 20. 20 CPU[0] CPU[1] CPU[2] RAM I/O System Multithreading em Memória Compartilhada  Difícil de escalar, pois quanto mais processadores, mais overhead de comunicação
  21. 21. Multithreading em Memória Compartilhada Facilidade de Uso Ajuste Fino Threading Intel® Math Kernel Library MPI Intel® Threading Building Blocks Intel® Cilk™ Plus OpenMP Pthreads 21
  22. 22. Multithreading em Memória Compartilhada OpenMP Fortran 2008 Intel® TBB Intel® Cilk Plus Site openmp.org fortranwiki.org opentbb.org cilkplus.org Lançamento 1997 2010 2006 2010 Linguagens Fortan, C, C++ Fortran C++ C/C++ Descrição Diretivas do Compilador (pragmas), runtime library Extensão de linguagem para adicionar paralelismo via Extensão da linguagem para adicionar paralelismo via templates Extensão da linguagem para multithreading/vetorização Método Pragmas Keywords Templates Keywords, atributos e pragmas Especificação By OpenMP ISO/IEC 1539-1:2010 Open Source iniciado pela Intel® Especificação aberta iniciada pela Intel® Funcionalidades Loops paralelos, tasks, locks Programação paralela Loops paralelos e algoritmos, alocação de memória Loops paralelos, vetorização, array notations, elemental functions, compatível com TBB Funcionalidades Únicas Amplamente adotada pela comunidade HPC DO CONCURRENT, Coarrays Independente de compilador, uso em vários tipos de aplicações, alocação de memória, suporte a outros modelos de programação paralela Garantia de performance em loadbalance, vetorização, array notations e elemental functions 22
  23. 23. API Padrão para memória compartilhada Consiste em: – Diretivas/Pragmas – Runtime Library • omp_set_num_threads(n) – Variáveis de Ambiente • OMP_NUM_THREADS Importante: – Uma Thread OpenMP para cada Core (ideal) • Permite mais de uma thread/core Multithreading em Memória Compartilhada OpenMP 23
  24. 24. Execução de um programa OpenMP Master Thread Thread 1 Thread 2 Thread n-1 Thread n Cada thread espera as outras terminarem o trabalho – “wait state” Master Thread #pragma omp parallel #pragma omp for Thread pool Multithreading em Memória Compartilhada OpenMP 24
  25. 25. Multithreading em Memória Compartilhada OpenMP Paralelizando um Loop 1. double res[200]; int i; 2. #pragma omp parallel for 3. for (i=0;i< 200; i++) { 4. res[i] = foo(); 5. } Thread 1 res[0] = foo(); res[1] = foo(); res[2] = foo(); res[3] = foo(); Thread 2 res[4] = foo(); res[5] = foo(); res[6] = foo(); res[7] = foo(); Thread N res[MAX-3] = foo(); res[MAX-2] = foo(); res[MAX-1] = foo(); res[MAX] = foo(); ... 25
  26. 26. Scheduling mode – static : • Distribui tasks entre as threads antes do início do loop . Menor overhead de comunicação, porém pode perder performance no load-balance – dynamic: • Distribui parte da carga no início, e durante o loop as tasks são distribuídas de acordo com a disponibilidade – guided: • Similar ao “dynamic”, porém a granularidade aumenta assim que a carga de processamento diminui. Pode resultar melhor load-balance Multithreading em Memória Compartilhada OpenMP 26
  27. 27. Multithreading em Memória Compartilhada OpenMP Scheduling mode – Quanto maior o tamanho do bloco, menor overhead, porém pior loadbalance – Quanto menor o tamanho do bloco, maior overhead, porém melhor loadbalance – Ponto de partida para tamanho do bloco: • > 1, menor que Num. Loops/Parallel Threads Especificando modo “dynamic” e bloco com tamanho 4 #pragma omp parallel for schedule(dynamic, 4) // ... 27
  28. 28. Reduction / Schedule 1. void SumColumns(const int m, const int n, long* M, long* s, char* method){ 2. for (int i = 0; i < m; i++) { 3. long sum = 0; 4. // Distribui cada linha entre as threads 5. // reduction para somar todas as colunas 6. #pragma omp parallel for schedule(guided) reduction(+: sum) 7. for (int j = 0; j < n; j++) 8. sum += M[i*n+j]; 9. s[i] = sum; 10. } Multithreading em Memória Compartilhada OpenMP 28
  29. 29. Task Parallelism em Memória Compartilhada OpenMP Performance – OpenMP Scheduling modes - Jacobi solver 29
  30. 30. Vetorização Como Vetorizar ? – Cinco possíveis abordagens: • Bibliotecas matemáticas – Ex.: Intel® Math Kernel Library (MKL) • Auto vetorização – Trabalho a cargo do Compilador • Diretivas/Pragmas – SIMD – IVDEP – VECTOR E NOVECTOR – Intel® Intrinsics • Array Notation – Cilk Plus – Notação vetorial na linguagem de programação explicitando a vetorização • Elemental Functions – Cilk Plus – Vetorizar código existente mantendo sua modularidade 30
  31. 31. Vetorização Como Vetorizar ? Facilidade de Uso Ajuste Fino Vectors Intel® Math Kernel Library Array Notation: Intel® Cilk™ Plus Auto vectorization Semi-auto vectorization: #pragma (vector, ivdep, simd) C/C++ Vector Classes (F32vec16, F64vec8) 31
  32. 32. Vetorização Auto Vetorização Ajudando o compilador a vetorizar – Evitar “loop unrolling” manual pois: • Atrela otimização a arquitetura de hardware (Vector Processor Unit) • Prejudica a leitura do código src1 [0] src1 [1] src1 [2] src1 [3] src2 acc1 acc2 acc3 acc4 acc * 32
  33. 33. Vetorização Auto Vetorização Unrolling Loop 1. double acc1 = 0, accu2 = 0, acc3 = 0, acc4 =0; 2. for (i=0; i<NUM; i+=4) { 3. acc1 = src1[i+0] * src2 + acc1; 4. acc2 = src1[i+1] * src2 + acc1; 5. acc3 = src1[i+2] * src2 + acc1; 6. acc4 = src1[i+3] * src2 + acc1; 7. } 8. accu = acc1 + acc2 + acc3 + acc4; Forma simplificada double acc = 0; for (i=0; i<NUM; i+=4) { accu = src1[i]*src2 + accu; } 33
  34. 34. Vetorização Auto Vetorização Requisitos para um loop ser vetorizado • Em loops encadeados, o loop mais interno será vetorizado • Deve conter apenas blocos básicos, ex.: uma única linha de código sem condições (if statements) ou saltos (go to) • Quantidade de iterações do loop deve ser conhecida antes de sua execução, mesmo que em tempo de execução • Sem dependências entre os elementos a serem calculados • GAP – Guided Autoparallelization (Intel® Compiler “-guide” ) pode ajudar Loop Não Vetorizável – Dependência sobre a[i-1] for (i=1; i<MAX; i++) { d[i] = e[i] – a[i-1]; a[i] = b[i] + c[i]; } 34
  35. 35. Vetorização Intel® C++ Intrinsic O que é Intel® C++ Intrinsic ? – Provê acesso a ISA (Instruction Set Architecture) através de código C/C++ ao invés de código Assembly – Ganho de performance próximo a códigos Assembly com a facilidade de C/C++ – Vetorização – Extensões SIMD (Simple Instructions Multiple Data) 35
  36. 36. Vetorização Intel® C++ Intrinsic MIC Intrinsics SSE Intrinsics 36
  37. 37. Vetorização Diretivas & Parâmetros do Compilador – Nem mesmo o mais fantástico compilador consegue vetorizar automaticamente o código – Ponteiros em C/C++ dificultam a vetorização • Dois ponteiros podem apontar para o mesmo endereço de memória – Diretivas SIMD: • Permissão ao compilador vetorizar • Responsabilidade da vetorização é do programador 37
  38. 38. Vetorização Diretivas & Parâmetros do Compilador Diretivas: #pragma simd [clause[ [,] clause] ... ] : guia o compilador para casos onde a auto-vetorização não é possível Atributos padrão: VECTORLENGTH N : tamanho do vetor (2, 4, 8 ou 16) VECTORLENGTHFOR (data-type) : tamanho_vetor/sizeof(type) PRIVATE (VAR1[, VAR2]...) : variável privada para cada iteração do loop FIRSTPRIVATE (VAR1[, VAR2]...) : broadcast do valor inicial a todas as outras instâncias para cada iteração LASTPRIVATE (VAR1[, VAR2]...) : broadcast do valor final a todas as outras instâncias LINEAR (var1:step [, var2:step2]...) : incrementa número de steps para cada variável em um loop, unit- stride vector REDUCTION (oper:var1[, var2]...) : Aplica operação de redução (+, *, -, AND, OR, EQV, NEQV) nas variáveis indicadas ASSERT : Direciona o compilador a produzir um erro ou um warning quando a vetorização falha 38
  39. 39. Vetorização Diretivas & Parâmetros do Compilador Alinhamento de dados #pragma vector aligned | unaligned : comunica ao compilador que os dados estão alinhados __assume_aligned keyword : elimita checagem se os dados estão alinhados, porém e´specífico para cada vetor __attribute__((aligned(64)) ou __mm_malloc() / __mm__free() : alocação estática e dinâmica de dados alinhados -opt-assume-safe-padding : completa os vetores com bytes extras para que fiquem múltiplos do tamanho da cache. Evita “loop sobressalente” 39
  40. 40. Vetorização Diretivas & Parâmetros do Compilador Removendo “Pointer Aliasing” #pragma ivdep : Ignora dependências de variáveis “restrict” ou “-restrict (argumento de linha de comando) : similar a “ivdep” , informa que determinada variável não possui restrições/dependências “Streaming Store” #pragma vector nontemporal | temporal ou “-opt- streaming-store always” : uso ótimo do cache em casos de write-only onde os dados não precisam ser armazenados na cache, e sim diretamente na memória. Usar “vector aligned” antes. 40
  41. 41. Vetorização Diretivas & Parâmetros do Compilador #pragma loop count : Informa ao compilador o número de loops . Útil para melhores predições de vetorização -vec-report[n] : relatório do que foi e do que pode ser vetorizado . “n” determina o nível de detalhes -guide : GAP – Guided Auto-parallelization . Sugestões de como vetorizar os loops -O[n] : Nível de otimização O2 (default) já inclui auto-vetorização -x[code] : Otimiza as instruções de acordo com a arquitetura do processador. Ex.: -xAVX , -xSSE2 #pragma novector : Instrui o compilador a não vetorizar. Útil em loops com muitas condições (ifs) #pragma vector always : força vetorização automática independente da heurística do compilador 41
  42. 42. Vetorização Elemental Functions Possibilita chamar versão vetorizada da função escalar Excelente em casos onde as funções estão implementadas em biblioteca de terceiros 42
  43. 43. Vetorização Elemental Functions Lib X float my_simple_add(float x1, float x2){ return x1 + x2; } Elemental Function __attribute__(vector) float my_simple_add(float x1, float x2); // ...em outro arquivo de código #pragma simd for (int i=0; i < N, ++i) { output[i] = my_simple_add(inputa[i], inputb[i]); } Ou my_simple_add(inputa[:], inputb[:]);43
  44. 44. Vetorização Array Notation Extensões C++ Intel® Cilk Plus para operações com vetores Indica paralelismo para vetorização automática 44
  45. 45. Vetorização Array Notation A[:] += B[:]; // todo o vetor é computado A[0:16] += B[32:16]; // A(0 até 15) + B(32 até 47) A[0:16:2] += B[32:16:4] // A(0, 2, 4, ...30) + B(32, 36, 38, ... 92) Compatibilidade com compiladores não-Intel #ifdef __INTEL_COMPILER A[:] += B[:]; #else for (int i=0; i<16; i++) A[i] += B[i]; #endif 45
  46. 46. Vetorização Exemplos Diretivas SIMD Adição de vetores – C/C++ 1.__declspec(align(16)) float a[MAX], b[MAX], c[MAX]; 2.#pragma simd 3.for (i=0; i<MAX; i++) 4. c[i] = a[i]+b[i]; Array Notation Cilk Plus Adição de vetores – C/C++ - Dados alinhados 1.__declspec(align(16)) float a[MAX], b[MAX], c[MAX]; 2.c[i:MAX] = a[i:MAX]+b[i:MAX]; 46
  47. 47. Vetorização Exemplos Array Notation Cilk Plus Adição de vetores – C/C++ - Dados alinhados 1.__declspec(align(16)) float a[MAX], b[MAX], c[MAX]; 2.__declspec(vector(uniform(B,C), linear(i:1))) 3.float foo(float* B, float *C, int i){ 4. return B[i]+C[i]; 5.} 6.... 7.for (i=0; i<MAX; i++) { 8. a[i] = foo(b,c,i); 9.} 47
  48. 48. Conclusões Fatos – Há muita computacional na indústria e nas universidades – No mundo desktop e mobile há muito espaço para otimizações – Existem ferramentas que facilitam a programação paralela – Multithreading e Vetorização são suportados pelos processadores atuais 48
  49. 49. Conclusões Técnicas de Otimização – Multithreading • Explorar multiplos cores por processador, múltiplas threads por core • Já passou da fase de tendência, hoje é realidade ! – Vetorização • Outra forma de paralelismo “data paralelism” • Processamento Vetorial disponível em smpartphones, ultrabooks e servidores 49
  50. 50. • Arquitetura, setup e recursos de programação • Treinamentos • Estudos de caso • Informações sobre as Ferramentas • Suporte através da comunidade (fóruns de discussão, artigos, etc.) 50 Intel®® Xeon® Phi™™ COPROCESSOR DEVELOPER SITE http://software.intel.com/mic-developer/ Links Importantes
  51. 51. Vetorização: • http://software.intel.com/en-us/intel-vectorization-tools Treinamentos: • An Overview of Programming for Intel®® Xeon®® processors and Intel®® Xeon® Phi™™ coprocessors • Intel®® Xeon® Phi™™ Coprocessor Developer’s Quick Start Guide • http://software.intel.com/mic-developer • The Training tab has Beginner and Advanced workshop videos, and links to past/future webinars • The Tools & Downloads tab has a link to Intel® and Third Party Tools and Libraries • This page has links to available beta and production for developers 51 Links Importantes
  52. 52. Intel® Advisor XE 2013 Informações: software.intel.com/en-us/intel-advisor-xe Video de demonstração: insidehpc.com/2012/11/30/demo-intel-advisor-xe-2013-transforms-code-for-intel-Xeon®-phi-at-sc12/ Intel® Parallel Studio XE Informações: software.intel.com/en-us/intel-parallel-studio-xe Video de demonstração: insidehpc.com/2012/11/28/video-intel-parallel-studio-xe-demo-at-sc12/ Intel® Cluster Studio XE Informações: software.intel.com/en-us/intel-cluster-studio-xe Video de demonstração: insidehpc.com/2012/11/29/intel-cluster-studio-xe-demo-at-sc12/ James Reinders on Exploiting Parallelism in the new Intel®® Xeon® Phi™™ coprocessors youtube.com/watch?v=g9ehO6duNuE&list=UUH5Rft7GYM8KZpxA-4Ohihg&index=9&feature=plcp Ferramentas de Desenvolvimento Intel® para o coprocessador Intel® Xeon® Phi™ coprocessor Links Importantes 52
  53. 53. Nota sobre Otimização
  54. 54. • INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL'S TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY WHATSOEVER AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF INTEL PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT. • A "Mission Critical Application" is any application in which failure of the Intel Product could result, directly or indirectly, in personal injury or death. SHOULD YOU PURCHASE OR USE INTEL'S PRODUCTS FOR ANY SUCH MISSION CRITICAL APPLICATION, YOU SHALL INDEMNIFY AND HOLD INTEL AND ITS SUBSIDIARIES, SUBCONTRACTORS AND AFFILIATES, AND THE DIRECTORS, OFFICERS, AND EMPLOYEES OF EACH, HARMLESS AGAINST ALL CLAIMS COSTS, DAMAGES, AND EXPENSES AND REASONABLE ATTORNEYS' FEES ARISING OUT OF, DIRECTLY OR INDIRECTLY, ANY CLAIM OF PRODUCT LIABILITY, PERSONAL INJURY, OR DEATH ARISING IN ANY WAY OUT OF SUCH MISSION CRITICAL APPLICATION, WHETHER OR NOT INTEL OR ITS SUBCONTRACTOR WAS NEGLIGENT IN THE DESIGN, MANUFACTURE, OR WARNING OF THE INTEL PRODUCT OR ANY OF ITS PARTS. • Intel may make changes to specifications and product descriptions at any time, without notice. Designers must not rely on the absence or characteristics of any features or instructions marked "reserved" or "undefined". Intel reserves these for future definition and shall have no responsibility whatsoever for conflicts or incompatibilities arising from future changes to them. The information here is subject to change without notice. Do not finalize a design with this information. • The products described in this document may contain design defects or errors known as errata which may cause the product to deviate from published specifications. Current characterized errata are available on request. • Intel processor numbers are not a measure of performance. Processor numbers differentiate features within each processor family, not across different processor families. Go to: http://www.intel.com/products/processor_number. • Contact your local Intel sales office or your distributor to obtain the latest specifications and before placing your product order. • Copies of documents which have an order number and are referenced in this document, or other Intel literature, may be obtained by calling 1-800-548-4725, or go to: http://www.intel.com/design/literature.htm • Intel, Core, Atom, Pentium, Intel inside, Sponsors of Tomorrow, Pentium, 386, 486, DX2 and the Intel logo are trademarks of Intel Corporation in the United States and other countries. • *Other names and brands may be claimed as the property of others. • Copyright ©2012 Intel Corporation. Legal Disclaimer

×