Sunday 24 June 2018

Cuda média em movimento


Eu não sou programador com nenhuma habilidade. Apenas alguém curioso sobre CUDA e por isso estou fazendo uma pequena leitura. Eu corri um exemplo de usar o Thrust para fazer uma média móvel: o exemplo, como é, corre e principalmente funciona corretamente. No entanto, é trivial no sentido de que ele só faz uma operação média móvel. Como eu diria 352 dessas operações de média móvel em paralelo, todos operando no mesmo fluxo de dados. Na minha mente, o fluxo do programa pode ser: Gerar o amplificador de dados enviá-lo para um núcleo CUDA. (O mesmo que o código existente, mas pense comprimentos de 1000 ou 10000 em vez de 30) Copie-o do núcleo CUDA para todos os outros 351 núcleos CUDA no meu GTX 465 Diga a cada núcleo CUDA qual o número de itens de dados em média. (4. 5. 352. 353. 354) Diga ao dispositivo que execute a média em cada núcleo em paralelo Leia de volta os resultados de cada núcleo Eu percebi que esse código faz com que tudo aconteça, mas como eu faço o impulso para fazer Muitos destes em paralelo Meu interesse aqui é sobre algo como dados de estoque. Se eu estiver olhando os preços GOOG, eu coloquei isso na GPU usando todos os núcleos e deixe-o lá. Então, seja livre para fazer muito processamento sem carregar mais os dados e apenas lendo os resultados de cada núcleo. NOTA: talvez eu não queira usar o GOOG em todos os núcleos. Alguns núcleos podem ser GOOG, outros com algum outro símbolo, mas eu vou chegar lá mais tarde. Estou apenas pensando que eu não quero os dados de estoque na memória global se houver espaço suficiente em cada núcleo. Eu suponho que isso seja bastante direto para o amplificador CUDA que o Thrust perguntou 12 de setembro 12 às 19:39. Meu entendimento é que você está interessado nas duas situações a seguir: você tem uma longa seqüência de itens e você deseja calcular um certo número de médias, por Com base em diferentes números de itens, ou seja, usando diferentes comprimentos para a janela da média móvel. Isto é o que eu entendo da sua pergunta original. Você tem uma série de seqüências, armazenadas consecutivamente na memória, e você deseja compará-las em paralelo com uma janela de média fixa de tamanho 2 RADIUS 1. Isso é o que o código ArrayFire proposto por asm faz - você aceitou. Em vez de usar CUDA Thrust, acho que seria mais fácil escrever seu próprio kernel CUDA para fazer as operações acima. Abaixo, um exemplo totalmente trabalhado que funciona da mesma maneira que o código ArrayFire proposto por asm, cobrindo o caso 2. A modificação para cobrir o caso 1 seria direta. Respondeu 15 de novembro às 15:42 Sua resposta 2017 Stack Exchange, IncPara outra abordagem, você pode truncar a janela da média móvel exponencial e, em seguida, calcular o seu sinal filtrado fazendo uma convolução entre o sinal e a exponencial janela. A convolução pode ser calculada usando a biblioteca FFT CUDA livre (cuFFT) porque, como você pode saber, a convolução pode ser expressa como a multiplicação pontual dos dois sinais no domínio fourier (Este é o nome apropriado do Teorema da Convolução, Que corre com uma complexidade de O (n log (n))). Este tipo de abordagem minimizará o código do kernel CUDA e executará muito rapidamente, mesmo em uma GeForce 570. Especialmente, se você puder fazer todos os seus cálculos em uma única precisão (flutuante). Respondeu 30 de abril 14 às 17:04 Eu proporia manipular a equação de diferença acima conforme indicado abaixo e depois usando primitivas de impulso CUDA. MANIPULAÇÃO DE EQUAÇÃO DE DIFERENÇA - FORMA EXPLÍCITA DA EQUILÍBRIA DE DIFERENÇA Por álgebra simples, você pode encontrar o seguinte: Conseqüentemente, a forma explícita é a seguinte: CUDA THRUST IMPLEMENTATION Você pode implementar a forma explícita acima pelas seguintes etapas: Inicializar uma sequência de entrada dinput para Alfa, exceto para dinput0. 1. Defina um vetor d1overbetatothen igual a 1, 1beta, 1beta2, 1beta3. Multiplique o dinposto elementar por d1overbetatothen Execute um inclusivecan para obter a seqüência do yn betan Divida a seqüência acima por 1, 1beta, 1beta2, 1beta3. 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 o CUDA Thrust e o cuFFT na minha resposta ao filtro FIR no CUDA. 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 do primeiro 3 períodos de tempo e colocados ao lado do período 3. Poderíamos ter colocado a média no meio do intervalo de tempo de três períodos, isto é, ao lado do período 2. Isso funciona bem com períodos de tempo estranhos, mas não é tão bom para até mesmo períodos de tempo. Então, onde é que nós 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 os MAs usando M 2. Assim, suavizamos os valores suavizados. Se medimos um número par de termos, precisamos suavizar os valores suavizados. A tabela a seguir mostra os resultados usando M 4.

No comments:

Post a Comment