gpt4 book ai didi

c++ - int64_t 指针转换为 AVX2 intrinsic _m256i

转载 作者:太空狗 更新时间:2023-10-29 21:37:07 27 4
gpt4 key购买 nike

你好,我有一个关于 AVX2 内在函数的奇怪问题。我创建了一个指向带有 int64_t* 转换的 _m256i vector 的指针。然后我通过取消引用指针来分配一个值。奇怪的是,在 vector 变量中没有观察到该值,除非我在它之后运行一些 cout 语句。指针和 vector 具有相同的内存地址,取消引用指针会产生正确的值,但 vector 不会。我错过了什么?

// 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|

最佳答案

当您偶尔需要访问单个元素时,我建议使用 _mm256_extract_epi64_mm256_insert_epi64 内部函数。如果您需要访问 vector 中的所有元素,请考虑使用 _mm256_store_si256_mm256_lddqu_si256 来存储和加载它。这些内在函数不太可能依赖未定义的行为,并且它们对于生成的机器指令(以及性能)是透明的。

关于c++ - int64_t 指针转换为 AVX2 intrinsic _m256i,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38362528/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com