首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >int64_t指针转换到AVX2内禀_m256i

int64_t指针转换到AVX2内禀_m256i
EN

Stack Overflow用户
提问于 2016-07-13 22:09:02
回答 1查看 861关注 0票数 3

你好,我对AVX2的本质有一个奇怪的问题。我创建一个指向具有_m256i强制转换的int64_t*向量的指针。然后,通过取消引用指针来赋值。奇怪的是,在向量变量中没有观察到这个值,除非我在它之后运行了几个cout语句。指针和向量具有相同的内存地址,并且取消引用指针会产生正确的值,但是向量不会。我遗漏了什么?

代码语言:javascript
运行
复制
// 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");
}
代码语言:javascript
运行
复制
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|
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-25 19:21:01

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38362528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档