相关疑难解决方法(0)

uint32_t和size_t的printf格式说明符

我有以下内容

size_t   i = 0;
uint32_t k = 0;

printf("i [ %lu ] k [ %u ]\n", i, k);
Run Code Online (Sandbox Code Playgroud)

编译时我收到以下警告:

format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’
Run Code Online (Sandbox Code Playgroud)

当我使用夹板运行时,我得到以下内容:

Format argument 1 to printf (%u) expects unsigned int gets size_t: k
Run Code Online (Sandbox Code Playgroud)

非常感谢任何建议,

c printf

96
推荐指数
4
解决办法
19万
查看次数

单词和字节之间有什么区别?

我做了一些研究.一个字节是8位,一个字是可以在内存中寻址的最小单元.单词的确切长度会有所不同.我不明白的是有一个字节是什么意思?为什么不说8位?

我问过这个问题的教授,他说这些天大多数机器都是字节可寻址的,但这会产生什么结果呢?

memory hardware assembly terminology cpu-architecture

88
推荐指数
7
解决办法
15万
查看次数

int的大小是否取决于编译器和/或处理器?

整数的大小是否取决于编译器,操作系统和处理器?

c c++ types

69
推荐指数
4
解决办法
4万
查看次数

最快的方法来乘以int64_t数组?

我想矢量化两个内存对齐数组的乘法.我没有找到任何方法在AVX/AVX2中乘以64*64位,所以我只是循环展开和AVX2加载/存储.有更快的方法吗?

注意:我不想保存每次乘法的高半结果.

void multiply_vex(long *Gi_vec, long q, long *Gj_vec){

    int i;
    __m256i data_j, data_i;
    __uint64_t *ptr_J = (__uint64_t*)&data_j;
    __uint64_t *ptr_I = (__uint64_t*)&data_i;


    for (i=0; i<BASE_VEX_STOP; i+=4) {
        data_i = _mm256_load_si256((__m256i*)&Gi_vec[i]);
        data_j = _mm256_load_si256((__m256i*)&Gj_vec[i]);

        ptr_I[0] -= ptr_J[0] * q;
        ptr_I[1] -= ptr_J[1] * q;
        ptr_I[2] -= ptr_J[2] * q;
        ptr_I[3] -= ptr_J[3] * q;

        _mm256_store_si256((__m256i*)&Gi_vec[i], data_i);
    }


    for (; i<BASE_DIMENSION; i++)
        Gi_vec[i] -= Gj_vec[i] * q;
}
Run Code Online (Sandbox Code Playgroud)

更新: 我正在使用Haswell微体系结构和ICC/GCC编译器.所以AVX和AVX2都很好.我在乘法循环展开后-=用C inrisic 替换_mm256_sub_epi64它,在那里得到一些加速.目前,它是ptr_J[0] *= q; ...

我用, …

c vectorization multiplication avx avx2

17
推荐指数
2
解决办法
1359
查看次数

QWORD之后会发生什么?

如果

  • 8位是一个字节

  • 两个字节是一个单词

  • 四个字节是双字节

  • 8个字节是一个qword

什么是16字节的好名字?

x86 assembly terminology intel

6
推荐指数
1
解决办法
1549
查看次数