您好,我有一個AVX2內部函數的奇怪問題。我用int64_t * cast創建一個指向_m256i向量的指針。然後我通過取消引用指針來分配一個值。奇怪的是,在向量變量中沒有觀察到該值,除非我在它後面運行一些cout語句。指針和向量具有相同的內存地址,並且取消引用指針會生成正確的值,但向量不會。我錯過了什麼?int64_t指針轉換爲AVX2內部_m256i
// Vector Variable
__m256i R_A0to3 = _mm256_set1_epi32(0xFFFFFFFF);
int64_t *ptr = NULL;
for(int m=0; m<4; m++){
// Cast pointer to vector type
ptr = (int64_t*)&R_A0to3;
cout<<"ptr_ADDRESS: "<<ptr<<endl;
cout<<"&R_A0to3_ADDRESS: "<<&R_A0to3<<endl;
// access
ptr[m] = (int64_t) m_array[m];
// generic function that prints out register
print_mm256_reg<int64_t>(R_A0to3, "R_A0to3");
cout<<"m_array: "<< m_array[m]<<std::ends;
// Additional print statements
cout<<"ptr[m]: "<< ptr[m]<<std::endl;
cout<<"ptr[0]: "<< ptr[0]<<std::endl;
cout<<"ptr[1]: "<< ptr[1]<<std::endl;
cout<<"ptr[2]: "<< ptr[2]<<std::endl;
cout<<"ptr[3]: "<< ptr[3]<<std::endl;
print_mm256_reg<int64_t>(R_A0to3, "R_A0to3");
}
Output:
ptr_ADDRESS 0x7ffd9313e880
&R_A0to3_ADDRESS 0x7ffd9313e880
m_array: 8
printing reg - R_C0to3 -1| -1| -1| -1|
printing reg - R_D0to3 -1| -1| -1| -1|
Output with Additional print statements:
ptr_ADDRESS 0x7ffd36359e20
&R_A0to3_ADDRESS 0x7ffd36359e20
printing reg - R_A0to3 -1| -1| -1| -1|
m_array: 8
ptr[0]: 8
ptr[1]: -1
ptr[2]: -1
ptr[3]: -1
printing reg - R_A0to3 8| -1| -1| -1|
這是什麼編譯器?我認爲這是海灣合作委員會中的一個角落案件,即使他們不應該這樣做,嚴格別名違規實際上也會造成問題。 (SIMD類型聲明爲'__may_alias__'。)您是否嘗試禁用嚴格別名? 「-Wstrict-aliasing」是否會讓它投訴? – Mysticial
@Mysticial:或許編譯器放棄保持變量的一致性,因爲程序有未定義的行爲?對於m = 4..9訪問'__m256i R_A0to3'外的'ptr [m]'。無論如何,這是使用向量的一種愚蠢的方式。不要這樣做。如果你真的想存儲到一個緩衝區並修改一個向量,那麼編寫這樣的代碼然後重新加載向量。或者可能使用聯盟。使用指針進行類型竄改並不是一個好習慣。 –
@PeterCordes啊哈,你是對的!我沒有看到它出界。 – Mysticial