sirven que punteros puntero parametros para los funciones estructura ejemplo dev datos como cadenas arreglos apuntadores c++ c++11 memory-alignment

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]; }