Moving average opencl


Trabalhando através dos exemplos e do código-fonte da Fixstars. Especificamente, estou tentando o último bit do código no capítulo 5 (duas médias móveis - aka Golden Cross): O código está disponível aqui: Posso publicar o exemplo específico abaixo. Mas a falta disso é que ao configurar a fila de comandos da seguinte maneira: commandqueue clCreateCommandQueue (context, deviceid, CLQUEUEOUTOFORDEREXECMODEENABLE, ampret) resulta em uma comando inválida (clError). Portanto, os dados de retorno não são processados ​​corretamente. IE. É tudo zero. No entanto, se eu configurar o código para calcular apenas uma média móvel, sem CLQUEUEOUTOFORDEREXECMODEENABLE, então as coisas funcionam. Correspondentemente, o código Fixstars antes deste capítulo parece funcionar bem. Estou trabalhando em um novo MacBook Pro (retina) que possui o chip NVIDIA. Então, estou pensando se é algum problema com a implementação da NVIDIA ou algum outro aspecto. Seja como for, é uma rolha de show para mim, como o que acabei por tentar fazer é disparar vários processos (idênticos) cada um com parâmetros diferentes, essencialmente o mesmo que este exemplo está tentando fazer ao calcular duas médias móveis de preço de ações simultaneamente. Predefinições de código abaixo. Eu adicionei uma função de impressão debug à sua fonte. Então eu vejo o seguinte como o meu programa é executado: com o resto dos dados sendo todos zeros também. Estou compilando com: gcc - O2 - c movingaveragevec4p. c gcc movingaveragevec4p. o - o movingaveragevec4p - framework opencl ---- (HOST CODE) moveaveragevec4p. c ---- ---- (OPENCL KERNEL CODE) moveaveragevec4.cl - --- Eu sei que isso é viável com o impulso de acordo com: Mas eu realmente gostaria de evitar o uso de impulso. Eu mencionei e não encontrei nenhum exemplo adequado ou legível. Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como amostra de dados. Qual é a maneira mais fácil de alcançar isso, experimentei usar uma matriz circular, uma média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequavam minhas necessidades. 12 de junho 12 às 4:38 Se suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador e, à medida que seu código examina cada amostra, o código atualiza o acumulador com o novo valor. Você escolhe um alfa constante que está entre 0 e 1 e calcula isso: você precisa apenas encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu já coloquei aqui. O problema é que 1000 é uma janela bastante longa para uma média móvel exponencial. Não tenho certeza se houver um alfa que espalhe a média nos últimos 1000 números, sem fluxo inferior no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou mais, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 às 4:44 1 na sua postagem. A média móvel exponencial pode permitir que o alfa seja variável. Assim, isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar alpha be (usecs desde a última atualização1000000). Ndash jxh 12 de junho 12 às 6:21 Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como uma amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados, evitando a trajetória O (N) cara para calcular a soma - necessária para a média - na demanda. Total é feito um parâmetro diferente de T para suportar, e. Usando um longo tempo quando totalizando 1000 long s, um int para char s, ou um duplo para float total s. Isso é um pouco falho em que numsamples poderia ultrapassar o INTMAX - se você se importar, você poderia usar um sinal não assinado por muito tempo. Ou use um membro extra de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (melhor então renomeado algo inócuo como pos). Respondeu 12 de junho 12 às 5:19 um assume que quotvoid operator (T sample) quot é realmente quotvoid operatorltlt (T sample) quot. Ndash oPless Jun 8 14 às 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer que ele seria um operador vazio () (amostra T), mas é claro que você poderia usar qualquer notação que você gostasse. Vou consertar, obrigado. Ndash Tony D 8 de junho 14 às 14: 27 Tenho um problema de programação e quero resolver usando o OpenCL. O problema é calcular a média móvel das matrizes. Por exemplo: Tenho 1000 matrizes: A, B, C, D. (por exemplo, cada matriz tem tamanho 4x4 ou maior) Eu quero calcular a média móvel dessas 1000 matrizes (por exemplo, tomar Tamanho da janela5) O resultado que eu quero é É este tipo de problema pode ser resolvido usando o OpenCL Muito obrigado pela ajuda opencl. 1 Sim, ele pode ser implementado usando OpenCL. Although há algumas sugestões que podem ajudá-lo a escrever um código de desempenho superior. Vou tentar implementá-lo eu mesmo, se eu tivesse tempo. 1. Se você não conseguir encaixar nos arrays de tamanho igual à sua janela no LDS, não seria uma boa idéia usar o LDS. Como neste caso, você estará usando um único elemento uma vez. 2.Referir ao capítulo 4 do guia de programação do OpenCL para ver o que pode ajudá-lo a melhorar seu desempenho. O padrão de acesso à memória é o mais importante se a memória global precisar ser usada.

Comments

Popular posts from this blog

Indicador de escalabilidade da ação do preço forex

Forex trading pdf books

Masaniello application al forex charts