Thursday 14 December 2017

Cuda média móvel exponencial


Ao calcular uma média móvel em execução, colocar a média no período de tempo médio faz sentido No exemplo anterior, calculamos a média dos três primeiros períodos de tempo e colocá-lo próximo ao período 3. Poderíamos ter colocado a média no meio da Intervalo de tempo de três períodos, ou seja, próximo ao período 2. Isso funciona bem com períodos de tempo ímpares, mas não é tão bom para mesmo períodos de tempo. Então, onde colocamos a primeira média móvel quando M 4 Tecnicamente, a Média Móvel cairá em t 2,5, 3,5. Para evitar esse problema, suavizamos as MAs usando M 2. Assim, suavizamos os valores suavizados Se formos uma média de um número par de termos, precisamos suavizar os valores suavizados A tabela a seguir mostra os resultados usando M 4.Para outra abordagem, você pode Truncar a janela de média móvel exponencial e, em seguida, calcular seu sinal filtrado, fazendo uma convolução entre o seu sinal ea janela exponencial. A convolução pode ser calculada usando a biblioteca CUDA FFT livre (cuFFT) porque, como você deve saber, a convolução pode ser expressa como a multiplicação ponto-sábia dos dois sinais no domínio fourier (Este é o apropriadamente chamado Teorema da Convolução, Que é executado com uma complexidade de O (n log (n))). Este tipo de abordagem irá minimizar o seu código CUDA kernel e correr muito, muito rapidamente, mesmo em uma GeForce 570 Particularmente, se você pode fazer todos os seus cálculos em única (float) de precisão. Eu gostaria de propor a manipular a equação de diferença acima como indicado abaixo e, em seguida, usando CUDA Thrust primitivas. DIFERENÇA EQUAÇÃO MANIPULAÇÃO - FORMA EXPLÍCITA DA DIFERENÇA EQUAÇÃO Por álgebra simples, você pode encontrar o seguinte: Em conformidade, a forma explícita é a seguinte: CUDA THRUST IMPLEMENTAÇÃO Você pode implementar a forma explícita acima pelas seguintes etapas: Inicializar uma entrada sequência dinput para Alfa, exceto para dinput0 1. Definir um vetor d1 overbetatothen igual a 1, 1 / beta, 1 / beta2, 1 / beta3. Multiplique o dinput elementwise por d1overbetatothen Execute um inclusivescan para obter a seqüência do yn / betan Divida a seqüência acima por 1, 1 / beta, 1 / beta2, 1 / beta3. A abordagem acima pode ser recomendada para sistemas Linear Time-Varying (LTV). Para os sistemas Linear Time-Invariant (LTI), a abordagem FFT mencionada por Paul pode ser recomendada. Estou fornecendo um exemplo dessa abordagem usando CUDA Thrust e cuFFT na minha resposta ao filtro FIR em CUDA. Thrust Neste post, nós fornecemos um exemplo de verificação de valores infinitos em uma matriz usando isinf () e explorando CUDA Thrust. O exemplo abaixo é equivalente a Matlabs dresultisinf (ddata). Incluem ltthrust / sequence. hgt include ltthrust / devicevector. hgt include ltthrust / hostvector. hgt include ltthrustdevicevector. hgt include ltthrustreduce. hgt include ltfloat. hgt // --- Operador para testar valores inf struct isinftest Qual é uma maneira eficiente de verificar se Uma matriz contém NANs ou valores infinitos em CUDA Esse problema pode ser reformulado como uma operação de redução. Isso pode ser efetivamente implementado usando CUDA Thrust a abordagem é transformar a matriz original para uma matriz booleana usando CUDAs isnan ou isinf e, em seguida, reduzindo a matriz transformada. Tudo o que pode ser realizado por expoiting thrust :: transformreduce. Abaixo está um exemplo que implementa em CUDA o equivalente de Matlabs sum (isnan (array)). Eu. Evite escrever reduções dos próprios em CUDA e usar CUDA Thrust sempre que possível é sempre recomendável. Abaixo há um código simples para avaliar o mínimo em uma matriz junto com seu índice. Ele é baseado em um exemplo clássico contido na apresentação Introdução à Emputação. A única adição é pular alguns elementos no counding, digamos o -1s. Isto pode ser razoavelmente feito substituindo todos os -1s na matriz por INTMAX (por thrust :: replace), isto é, o máximo representável i. Suponha que um tem o filtro de média móvel exponencial definido pela equação de diferença abaixo de yn yn-1 beta alfa xn em que alfa e beta são constantes. A questão é sobre como implementá-la eficientemente no CUDA. Uma possibilidade seria calcular a forma explícita da resposta do filtro e então usar os primitivos oferecidos pelo CUDA Thrust. Em particular, pela álgebra simples, pode-se encontrar o seguinte: y1 beta y0 alfa x1 y2 beta2 y0 alfa ser. Aqui está um exemplo completo de como transformar, por CUDA Thrust, cada elemento x de um array CUDA por pow (x, a), sendo a constante. Tudo é necessário é definir um functor executando a exponenciação e usando thrust :: transform. Do ponto de vista da programação paralela, a integração é basicamente uma redução, de modo que uma maneira muito simples de implementar a integração CUDA está explorando os primitivos da biblioteca Thrust. Abaixo está um exemplo simples implementando o método de integração de Romberg pelas primitivas Thrust. É uma tradução direta do código Matlab correspondente disponível neste site, então este exemplo também mostra como simplesmente alguns códigos Matlab podem ser portados para CUDA por Thurst. Incluem ltthrust / sequen. Simpsons integração pode ser facilmente implementada usando CUDA Thrust. Você basicamente precisa de cinco etapas: 1. Gerar os pesos de quadratura Simpsons 2. Gerar os pontos de amostragem de função 3. Gerar os valores de função 4. Calcular o produto elementwise entre os pesos de quadratura e os valores de função 5. Soma os produtos acima. Passo 1 requer a criação de uma matriz com elementos repetidos muitas vezes, ou seja, 1 4 2 4 2 4. 1 para o caso Simpsons. Isto pode ser conseguido por bor. Matlabs linspace comando pode ser facilmente implementado em CUDA Thrust por ajuda de contando iteradores. Aqui está um exemplo muito simples: include ltthrust / devicevector. hgt include ltthrust / transform. hgt include ltthrust / functional. hgt include ltthrust / iterator / countingiterator. hgt include ltthrust / iterator / constantiterator. hgt include ltcstdiogt include ltconio. hgt void main ( ) Por CUDA Thrust, é muito fácil encontrar o índice do primeiro elemento de um vetor que satisfaça um predicado. Em outras palavras, por algumas instruções, é possível paralelizar o seguinte código C seqüencial: for (int i 0 i lt ArrayLength i) ou código Matlab: min (find (xlt0)) No exemplo acima, xlt0 foi assumido como O predicado à mão. A idéia básica é usar iteradores Thrust, thrust :: findif e thrust :: distance. Thrust é uma biblioteca de algoritmos paralelos cujas rotinas foram criadas para se assemelhar a chamadas para a C Standard Template Library (STL). É muito útil conseguir rapidamente a paralelização com uma sintaxe de alto nível. Por Thrust, os códigos herdados (por exemplo, escrito em Matlab) podem ser facilmente traduzidos para uma abordagem paralela CUDA. Por exemplo, a seguinte sintaxe de Matlab ddiff2 (1: n-2) dy (3: n) - 2. dy (2: n-1) dy (1: n-2) para calcular diferenças centrais de segunda ordem pode ser obtida como Uma aplicação. Este artigo investiga o uso de processadores gráficos inativos para acelerar o DSP de áudio para algoritmos em tempo real. Vários algoritmos comuns foram identificados para aceleração e foram executados em múltiplas configurações de thread e bloco para determinar a configuração desejada para os diferentes algoritmos. A GPU ea CPU que executam nos mesmos tamanhos de dados e algoritmo são comparadas entre si. A partir desses resultados, o artigo discute a importância de otimizar o código para a operação de GPU, incluindo a alocação de recursos compartilhados, a otimização de transferências de memória ea serialização forçada de loops de realimentação. Ele também introduz um novo método para processamento de áudio usando GPUs como o processador padrão em vez de um acelerador. Autores: Jillings, Nicholas Wang, Yonghao Afiliação: Birmingham City University, Birmingham, Reino Unido AES Convenção: 137 (Outubro de 2017) Paper Number: 9120 Data de publicação: 8 de outubro de 2017 Importar para BibTeX Assunto: Org / e-lib / browse. cfmelib17443 Este documento custa 33 para não-membros e é gratuito para membros da AES e assinantes da E-Library. Localização da Biblioteca Eletrônica: (CD 137Papers) /conv/137/9120.pdfRecurrenenlinearpartialdifferentialequations. cu. Avaliação de relações de recorrência envolvidas em equações diferenciais não lineares ThrustStreamBreadthFirst. cu. Usando CUDA streams com Thrust APIs cumulativedistribution. cu. Calcular a distribuição cumulativa de uma distribuição de probabilidade minelement. cu. Calcular o elemento mínimo de um array juntamente com sua posição stridedreduction. cu. Sum cada STRIDE elementos de um vetor Reducerows. cu. Reduzir cada linha de uma matriz, consulte Reduzir linhas de matriz com CUDA Reducecolumns. cu. Reduzir cada coluna de uma matriz, consulte Reduzir colunas de matriz com CUDA Max2elementsofeachrow. cu. Determine o máximo de 2 elementos de cada linha, consulte Determinando os 2 maiores elementos e suas posições em cada linha de matriz com CUDA Thrust Minelementofeachcolumn. cu. Determine o menor elemento de cada coluna, consulte Determinando o menor elemento e sua posição em cada coluna de matriz com CUDA Thrust Sortrows. cu. Classificar as linhas de uma matriz, consulte Simultaneamente ordenar muitos arrays com CUDA Thrust Sorttuples. cu. Classifique tuplas com um operador de comparação personalizado, consulte Classificar tuplas com CUDA Thrust Sortbykeywithtuplekey. cu. Classifique um vetor por uma chave de tupla com um operador de comparação personalizado, veja CUDA Thrust sortbykey quando a chave é uma tupla tratada por zipiterators com o predicado de comparação personalizado Reducebykeywithtuplekeyhost. cu. Redução por chave com chave que é uma tupla, chave e matrizes de valor são hostvector s, consulte Redução por chave com chave de tupla Reducebykeywithtuplekeydevice. cu. Redução por chave com chave que é uma tupla, chave e arrays de valor são ver regular, cudaMalloc ed vectores Redução por chave com chave de tupla Rowreorderingbykey. cu. Reordenando as linhas de uma matriz por chave, consulte Reordenar linhas de matriz por chave Reducecolumnsbykey. cu. Reduzindo as colunas de uma matriz por chave, veja. Findkeyoccurrencesandfirstpositions. cu. Encontrando a posição das primeiras ocorrências de chaves e contando o número de suas ocorrências, veja Encontrando o número de ocorrências de chaves e as posições de primeiras ocorrências de chaves por CUDA Thrust Rowscaling. cu. Dimensionando as linhas de uma matriz por um vetor de coeficientes, consulte Escalando as linhas de uma matriz com CUDA Replicatearraymultipletimes. cu. Replicar uma matriz várias vezes, consulte Replicar um vetor várias vezes usando CUDA Thrust RowwiseColumnwiseoperationsonmatrices. cu. Aplicar a mesma operação em linhas ou colunas de matriz, consulte Operações em linhas / colunas em matrizes com CUDA Calculatingthenormofarrays. cu. Calcule a norma l2 de uma matriz, consulte Cálculo da norma l2 de uma matriz usando CUDA Thrust Cálculo da projeção deavectoronaset. cu. Calcular a distância euclidiana entre um vetor e um conjunto de vetores organizados em uma matriz, em seguida, seleciona o mínimo, ver. CalculandoEuclideandistancesbetweenrowsoftwomatrices. cu. Calcular a distância euclidiana entre filas homólogas de duas matrizes, ver Computação das distâncias euclidianas entre as correspondentes filas de matrizes com CUDA Findminimaalongrowsalong com theircolumnindices. cu. Minima das linhas de uma matriz junto com seus índices de coluna, consulte Localizar os mínimos das colunas de uma matriz junto com seus índices de linha correspondentes com CUDA Thrust Findminimaalongcolumnsalongwiththeirrowindices. cu. Minima das colunas de uma matriz junto com seus índices de linha, consulte Localizar os mínimos das linhas de uma matriz juntamente com seus índices de coluna correspondentes com CUDA Thrust Thrustinsideuserwrittenkernels. cu. Usando o thrust :: seq e thrust :: device para chamar primitivas CUDA Thrust de kernels escritos pelo usuário CUDA, veja chamando primitivas CUDA Thrust dentro de um kernel CostFunctionalCalculationThrust. Usando Thrust para calcular o custo funcional para a otimização global envolvendo um grande número de incógnitas, consulte Cálculo de custo funcional para otimização global em CUDA ExponentialMovingAverageFilter. cu. Usando Thrust para implementar um filtro de média móvel exponencial descrito por uma equação de diferença, consulte Implementando um filtro de média móvel exponencial por CUDA Thrust linspace. cu. Emulando Matlabs linspace comando por CUDA Thrust, veja Emulando Matlabs linspace comando por CUDA Thrust colon. cu. Emulando o operador do cólon de Matlabs por CUDA Thrust, veja o operador do Cólon de Emulating Matlabs por CUDA Thrust SaxpyPlaceholders. cu. Usando a técnica de espaço reservado para implementar a operação saxpy com CUDA Thrust, veja CUDA Thrust atalho funções matemáticas SaxpyLambdas. cu. Usando expressões lambda para implementar a operação saxpy com CUDA Thrust, veja expressões Lambda com CUDA Minmaxarray. cu. Simultaneamente encontrar os elementos mínimo e máximo de uma matriz com CUDA Thrust, consulte Retornando os elementos mínimo e máximo de uma matriz em CUDA Você não pode executar essa ação neste momento. Você fez login com outra guia ou janela. Atualize para atualizar sua sessão. Você efetuou login em outra guia ou janela. Atualize para atualizar sua sessão.

No comments:

Post a Comment