2011-09-14 4 views
7

Intel ofrece un pragma de captación previa; por ejemplo¿Cómo usar el pragma de captación previa de información cuando los datos están ocultos dentro de un objeto?

#pragma prefetch a 
for(i=0; i<m; i++) 
    a[i]=b[i]+1; 

se precapturar a un cierto número de ciclos de bucle por delante, tal como se determina por el compilador.

¿Pero qué pasa si a no es una matriz sino una clase con [] anulada? Si operator[] hace un simple acceso a la matriz, ¿se puede usar de esta manera la recuperación previa?

(Probablemente la pregunta se aplica al std::vectors también).

Respuesta

2

Una forma de averiguarlo es probarlo y mirar el conjunto. Y, si hay algo más, simplemente cotejarlo con y sin el pragma. Sin embargo, no estoy seguro de si el pragma prefetch es el que desea:

El pragma de captación previa solo es compatible con los procesadores Intel® Itanium®.

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/cref_cls/common/cppref_pragma_prefetch_noprefetch.htm

¿Está realmente escribiendo esto para un Itanium?

En los sistemas x86/x64, los bucles simples como los que tienen acceso a la memoria secuencial ya están bien manejados por el prefetcher de hardware. Por lo tanto, puede que no ayude en absoluto a realizar la captación previa manual.

Vea aquí un ejemplo de la obtención previa: Prefetching Examples?

+0

Estoy compilando tanto para x86 y Itanium - y asumiendo cualquier persona preocupada por el rendimiento va a utilizar este último (en una rejilla). Gracias por señalar lo que hace el prefetcher de hardware. No me había dado cuenta. –

+0

En 2018, este pragma se aplica solo a Intel® MIC Architecture y Intel® Advanced Vector Extensions 512 (Intel® AVX-512). – Olsonist

+0

Y la recuperación previa funciona en x86 en general, pero no con el pragma de captación previa. En su lugar, use los indicadores -ptop-prefetch. – Olsonist

Cuestiones relacionadas