2013-07-26 2 views
0

Предположим, что у нас есть этот код:Alignment (16 байт) промежуточных указателей динамически

float *data = (float*)_mm_malloc(N*sizeof(float), 16);//allocate 16-byte aligned array of N elements 
const int loop_bound1 = .....;//some value 
const int loop_step = .....;//some value 
const int loop_bound2 = ....;//some value 
for(auto i=0; i<loop_bound; i+=loop_step) 
{ 
    auto inter_data1 = data + i;//inter_data1 may be not aligned 
    for(int j=0; j<loop_bound2; ++j) 
    { 
     auto inter_data2 = inter_data1 + j;//inter_data2 also may be not aligned 
     __m128 a = _mm_loadu_ps(inter_data2);//it's ok, but I want use _mm_load_ps instead 
    } 
} 

Вызов _mm_load_ps вместо _mm_loadu_ps требует, чтобы inter_data1 и inter_data2 16-байтовый выровнены. Каков наилучший (безопасный и с минимальными накладными расходами) способ выравнивания этих poinetrs? Я считаю, std :: align, но я не уверен, что это правильный выбор.

+0

Вы переходите через свой массив в 4-байтовых фрагментах (sizeof float), поэтому вы, безусловно, должны быть выровнены по 16 байт только на каждом 4-м доступе. Но вы, похоже, загружаете 16-байтовые куски. Если вам действительно нужны ваши куски, чтобы они накладывались таким образом, они не могут быть выровнены. Если они не должны пересекаться, ваша петля в первую очередь ошибочна. – Useless

ответ

1

Выделите память _aligned_malloc на Windows или memalign на Linux, тогда ваши указатели будут выровнены в стеке. Или, если вы хотите выровнять память в куче, вы можете использовать #pragma pack.

1

Стандартные реализации будут использовать:

__declspec(align(n)) 

... где «п» число байтов, необходимо выровнять тип данных для. Вы можете создать несколько макросов для различных трасс, таких как:

#define AALIGN(n) __declspec(align(n)) 
#define AALIGN4  __declspec(align(4)) 
#define AALIGN8  __declspec(align(8)) 
#define AALIGN16  __declspec(align(16)) 
#define AALIGN32  __declspec(align(32)) 
#define AALIGN64  __declspec(align(64)) 

... а затем вы можете объявить свои данные, такие как:

AALIGN16 float m_fMyAlignedFloat; 

Надежда, что помогает!

Смежные вопросы