c++ - que - Puntero a memoria alineada
punteros y arreglos en c (1)
Me parece un error. Su sintaxis es perfectamente correcta y aceptada por las versiones más recientes de GCC
y Clang
.
En primer lugar, es importante qué versión de Intel C++ Compiler
está utilizando actualmente.
Según este documento :
3.2 Características nuevas y modificadas
C ++ Composer XE 2015 ahora contiene Intel® C ++ Compiler XE 15.0. Las siguientes funciones son nuevas o mejoradas significativamente en esta versión:
- [...]
Compatibilidad completa con el lenguaje C ++ 11 (incluye esta característica nueva a 15.0) (/ Qstd = c ++ 11):
- categorías de valor (N3055)
- alignas y alignof (n2341)
- extensiones decltype (N3049, N3276)
- constructores hereditarios (N2540)
- literales definidos por el usuario (N2765)
- thread_local (N2659)
En primer lugar, observe la presencia de alignas
en la lista: puede asumir el respaldo total (o al menos "la comparación con la versión anterior" ) de estas características a partir de ICC 15.0
. En segundo lugar, "nuevo o significativamente mejorado" no es igual a "totalmente compatible" , si me preguntas.
Este resumen también confirma la compatibilidad de las características de alineación en esta versión.
Observa, sin embargo, que:
El soporte completo de C ++ 11 requiere un entorno gcc 4.8 o más reciente en Linux.
También me encontré con this , lo que puede sugerir, que no todo funciona correctamente todavía.
Como @Simon descubrió, este es un problema confirmado (o, para ser más preciso, falta de soporte) y se ha informado. El número de rastreador es DPD200361116 . Más información se puede encontrar en este hilo . Si alguien más tiene este problema, le sugiero que realice un seguimiento de las actualizaciones en esta página, seguramente se publicarán.
A menudo utilizo la vectorización basada en compilador, por ejemplo, para AVX. Estoy tratando de encontrar una forma más limpia sin depender de las extensiones basadas en compiladores (como el #pragma vector aligned
Intel) al confiar en las características de alineación de C ++ 11. Si considera el siguiente código, por ejemplo, aligned::array<double,48> my_array;
me permite declarar una matriz en la pila con la alineación adecuada, y si se usa en la misma unidad de traducción, los compiladores parecen reconocer esto.
Mi pregunta ahora se refiere a cómo declarar una función con parámetros alineados. Mi intento más exitoso es, por ejemplo, aligned::ptr<double>
, como se usa en la función f()
continuación.
gcc
compila esto sin advertencias (use -std=c++0x -O3
), y el bucle se vectoriza. Sin embargo, el icc
de Intel da una advertencia y no se vectoriza correctamente ( warning #3463: alignas does not apply here; using type alignas(64) = T;
).
¿Quién es correcto? ¿Hay algo mal con mi uso de alignas? ¿Hay una mejor manera de lograr esto?
namespace aligned {
template <class T, int N>
using array alignas(64) = T[N];
template <class T>
using type alignas(64) = T;
template <class T>
using ptr = type<T> *;
}
#ifdef __ICC
#define IVDEP "ivdep"
#else
#define IVDEP "GCC ivdep"
#endif
void f(aligned::ptr<double> x, const aligned::ptr<double> y) {
_Pragma(IVDEP)
for(int i=0; i<4; i++)
x[i] = x[i]*y[i];
}