En local, c'est 3 cycles :
1- Register read
2- Memory read
3- Write back to register
En externe, selon mon expérience sur le GPU, on peut dire qu'en
moyenne on arrive à du 10-12cycles :
1- Register read
2- Memory gateway
3...N- Shared memory controller / DRAM controller / Shifter/Latch
N+1- Write back to register
J'ai jamais vraiment joué avec le DSP, mais sachant qu'il a un bus 16-bit et qu'il doit faire la demande à TOM de mettre à dispo les datas, c'est peut être plus long.
Néanmoins, je pense que c'est compensé en partie, du moins sur la
moyenne, par le fait qu'il est le CPU ayant la plus haute priorité, donc peut-être tabler sur du 15-20cycles.
Sinon, ca peut être effectivement un peut plus rapide, comme ca peut être (beaucoup) plus long dépendant des activités sur le bus :
Typiquement si l'OP bouffe toute la bande passante pour traiter la liste (ce qui est pratiquement le cas sur la demo FActS), tu peux avoir jusqu'à 15360µs (64µs *240lignes) où tu peux bloquer ton GPU/DSP si ils tentent de faire un accès mémoire externe.
Du coup dans FActS, le DSP n'utilise que la ram interne (merci Zerosquare !

), et le GPU n'accède au bus que sur les lignes non visibles.
Sinon, du fait que le GPU/DSP sont à architectures pipeline, ce que je fais c'est insérer le max d'instructions utiles entre le load et l'instruction qui va avoir besoin de la data lue.
Sur un accès mémoire interne tu peux en général facilement ajouter une instruction dans le slot2.
Sur un accès mémoire externe, c'est en général un peut plus compliquer car le delai étant très long, c'est pas simple d'avoir une 10ene d'instructions utiles qui n'a pas besoin de la donnée lue.
Dans mon optimisation du code pour le Plannar2Chunky (voir sur mon site les explications des optimisations), je me suis arrangé pour lire la donnée un coup en avance par rapport au calcul, du coup je perds une 10ene de cycles au démarrage, mais je ne perds plus de cycles sur les autres boucles.