Pergunta

Eu estou tentando ler a partir da memória principal usando masm32 montagem e, a fim de fazer isso eu criei (como anteriormente recomendado em uma resposta a outra das minhas perguntas aqui) uma matriz que conterá as posições de memória muito separados (a fim de evitar a leitura de cache). Eu consegui criar a matriz e tê-lo a ser lido, no entanto, eu tenho um problema. Esta matriz eu já fiz e testado é trabalhar com dados que lhe deram (ou seja, números) e tudo funciona. Mas eu preciso de posições de memória e não consigo encontrar em qualquer lugar um mapa ou referências a esses. Quer dizer, eu preciso de algo como:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

mas em vez de usar números que eu deveria estar usando os correspondentes localização de memória palavras reservadas. Mas eu não posso encontrá-los = (ou mesmo ter uma idéia do que outra coisa que procurar.


Editar

Deixe-me apenas verificar se eu entendi corretamente, você, em seguida, dizer-me que eu poderia (em vez de usar um uso conjunto das variáveis ??com todo o espaço entre a leitura vigor da direita memória principal?

Foi útil?

Solução

Esta é uma matriz de (contígua) bytes, como você disse:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

Esta é uma variável que ocupa 10 MB (que é grande em relação ao cache da CPU):

wasted_space BYTE 10485760 DUP(?)

Aqui estão várias variáveis ??com um monte de espaço desperdiçado entre:

my_var_1 db 5
spacer_1 BYTE 10485760 DUP(?)
my_var_2 db 2
spacer_2 BYTE 10485760 DUP(?)
my_var_3 db 8
spacer_3 BYTE 10485760 DUP(?)
my_var_4 db 9
spacer_4 BYTE 10485760 DUP(?)
my_var_5 db 1
spacer_5 BYTE 10485760 DUP(?)
my_var_6 db 7
spacer_6 BYTE 10485760 DUP(?)
my_var_7 db 3
spacer_7 BYTE 10485760 DUP(?)
my_var_8 db 0
spacer_8 BYTE 10485760 DUP(?)
my_var_9 db 4
spacer_8 BYTE 10485760 DUP(?)
my_var_10 db 6

Esta (a criação de variáveis ??em seu segmento de dados) é uma maneira de obter alguns endereços de memória de dados (as variáveis ??não contêm o endereço ... em vez disso, as variáveis ??estão em endereços).

Outra forma de obter endereços de memória é invocar O / S APIs, que alocam memória da pilha e retornar o endereço dessa memória alocada, por exemplo, talvez as APIs heapalloc ou VirtualAlloc.


Eu não sei por que você está fazendo isso em ASM (exceto para aprender assembly). Se é para aprender sobre caching, eu teria pensado que você poderia fazê-lo tão bem (e, mais facilmente), utilizando C.

De qualquer forma, fiquei curioso sobre o cache: quanto espaço é suficiente para causar um erro de cache? Quantas diferentes variáveis ??são necessárias para começar a causar acidentes (dado que o cache é dividida e assim pode conter vários (mas apenas alguns) caches de memória amplamente espaçados)?

It (caching) tem, ao longo dos anos, tornar-se um assunto complicado, aparentemente. http://lwn.net/Articles/252125/ é um artigo ligado a partir de Wikipedia. Este artigo inclui alguns gráficos, por exemplo Figura 3.11:. Sequential leitura para Vários tamanhos

Outras dicas

acesso à memória indireta na Assembléia

Para tratar os bytes na matriz como endereços de memória, você precisará carregá-los em um registo que pode servir como um endereço de base e, em seguida, acessar a memória apontada pelo registo:

MOV AX, [MY_ARR+3]  ; Element 3 in array, that is 9
MOV BX, [AX]        ; Read from that address

Sobre caches

Note que o cache é provavelmente muito maior do que o espaço de endereços de memória cobertos por essa matriz, então tudo se encaixaria no cache.

Além disso, consideram que o cache é provavelmente associativa, o que significa que os endereços muito distantes podem se encaixam no cache se não acontecer de ser as mesmas (completo) linhas de cache.

Para rodar o cache e garantia de que você terá de memória de acesso diretamente, você deve acessar (em um loop) um conjunto de posições de memória consecutivas maiores do que o seu cache. Ou seja, criar uma matriz tão grande quanto o seu cache. Também ter em conta que há provavelmente várias camadas de cache (L1, L2, L3, possivelmente, e mais), assim como grande você precisa estar depende do que armazenar em cache que você quer superação.


Eu escrevi um programa em C para a memória tempo e cache de acessos como que uma vez, e com alguns cálculos estatísticos e compensação para a sobrecarga de medição do tempo (que é não negligenciável em tais escalas de tempo curtos), tem resultados muito precisos ( o que poderia ser feito tão precisos quanto necessário para a execução do teste por mais tempo e espera para o desvio padrão para ir para baixo).

O meu programa, contudo, não era a maneira mais eficiente de fazer isso, e também não sugeriu muito sobre a associatividade do cache (eu teria que medir isso separadamente com conhecimento do esquema de coloração). No entanto ambos foram feito muito eficiente de uma forma relativamente independente de arquitetura com alguns truques pensada na Sigmetrics 2005 trabalho de Larry McVoy e Carl Staelin .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top