2015-08-27 8 views
0

J'ai une longue boucle où des ajouts de vecteurs au néon sont effectués sur des éléments de 8 bits. Le problème est qu'après un certain temps, il est presque certain que certains ou tous les composants du vecteur sont saturés à cause du débordement. Existe-t-il un moyen rapide de détecter ceci afin que je puisse vider les résultats, zéro le vecteur et continuer? J'ai déjà essayé en vérifiant les drapeaux C et V mais il semble que les opérations au néon ne les définissent pas.NEON Détection de dépassement de capacité

edit: voici le code d'intérêt, un peu simplifié. En outre, je suis passé à 16 bits, mais il faudra encore déborder

int16x8_t Sum; 
for(int C = 0; C < 100; C++) 
{ 
    // Sum += |a - b| 
    Sum = vabaq_u16(
     Sum,      
     vld1q_u16((uint16_t *)a), 
     vld1q_u16((uint16_t *)b) 
    ); 
} 
+0

il serait probablement utile si vous montrez du code afin que les gens puissent voir exactement ce que vous voulez dire –

+0

fait, merci – CDevel

+0

Je prends le compte de 100 articles l'un des simplifications? Je ne vois pas comment vous pourriez déborder 16 bits accumulant des valeurs de 8 bits autrement (65535/255 = 257> 100). – Notlikethat

Répondre

0

Si vous utilisez VQADD pour la somme, non seulement il sature (pince) les valeurs au lieu de déborder et d'emballage autour (qui peut être souhaitable dans lui-même), mais il établira également le drapeau de saturation (bit 27) dans le FPSCR chaque fois que cela se produit. Une fois défini, ce drapeau doit être effacé manuellement en réécrivant la valeur FPSCR avec le bit 27 mis à zéro. Une alternative possible, en fonction de la façon dont le reste de l'algorithme utilise le résultat, pourrait être de diviser votre accumulateur sur deux registres et d'utiliser une opération d'élargissement (VABAL) sur chaque moitié des vecteurs d'entrée pour accumuler 16 bits éléments, vous pouvez simplement vider le résultat à un intervalle prédéterminé sans jamais avoir besoin de vérifier explicitement. Comme le nombre minimal de valeurs 8 bits non signées requises pour déborder d'un accumulateur de 16 bits est de 258 (65535/255 = 257), alors si la boucle vide le résultat tous les 257 ou moins de dépassements d'itérations deviennent impossibles.

+0

Ok, j'ai édité la question en ajoutant du code. Je vais enquêter pour vérifier si vabaq utilise vqadd pour accumuler les résultats ou non. Si ce n'est pas le cas, je peux créer mon propre intrinsèque, probablement avec vaba et vqadd, mais j'ai encore besoin de faire des recherches à ce sujet. – CDevel

+0

Vous pouvez toujours utiliser l'approche d'élargissement avec une paire d'intrinsèques 'vabal'. En y réfléchissant, de cette façon, vous n'auriez pas besoin de perdre du temps à vérifier le débordement - il suffit de vider les vecteurs de résultat après toutes les 256 itérations et vous ne pouvez pas garantir que cela n'arrive jamais. – Notlikethat