相关疑难解决方法(0)

这个memcpy实现中缺少什么/次优?

我对编写一个memcpy()教育练习感兴趣.我不会写一篇关于我做了什么和没想过的论文,但这里 有一些人的实现:

__forceinline   // Since Size is usually known,
                // most useless code will be optimized out
                // if the function is inlined.

void* myMemcpy(char* Dst, const char* Src, size_t Size)
{
        void* start = Dst;
        for ( ; Size >= sizeof(__m256i); Size -= sizeof(__m256i) )
        {
                __m256i ymm = _mm256_loadu_si256(((const __m256i* &)Src)++);
                _mm256_storeu_si256(((__m256i* &)Dst)++, ymm);
        }

#define CPY_1B *((uint8_t * &)Dst)++ = *((const uint8_t * &)Src)++
#define CPY_2B *((uint16_t* &)Dst)++ = *((const uint16_t* &)Src)++
#define CPY_4B …
Run Code Online (Sandbox Code Playgroud)

c optimization x86 simd avx

26
推荐指数
3
解决办法
4232
查看次数

从两个数组的点积测量内存带宽

两个数组的点积

for(int i=0; i<n; i++) {
    sum += x[i]*y[i];
}
Run Code Online (Sandbox Code Playgroud)

不重用数据,因此它应该是一个内存绑定操作.因此,我应该能够从点积测量内存带宽.

使用代码 为什么 - 矢量化 - 循环 - 没有性能改进 我的系统带宽为9.3 GB/s.但是,当我尝试使用点积计算带宽时,我获得单个线程的速率的两倍以及使用多个线程的速率超过三倍(我的系统有四个核心/八个超线程).这对我没有意义,因为内存绑定操作不应该受益于多个线程.以下代码的输出如下:

Xeon E5-1620, GCC 4.9.0, Linux kernel 3.13
dot 1 thread:      1.0 GB, sum 191054.81, time 4.98 s, 21.56 GB/s, 5.39 GFLOPS
dot_avx 1 thread   1.0 GB, sum 191043.33, time 5.16 s, 20.79 GB/s, 5.20 GFLOPS
dot_avx 2 threads: 1.0 GB, sum 191045.34, time 3.44 s, 31.24 GB/s, 7.81 GFLOPS
dot_avx 8 threads: 1.0 GB, sum 191043.34, time 3.26 …
Run Code Online (Sandbox Code Playgroud)

c++ memory bandwidth openmp avx

20
推荐指数
1
解决办法
2457
查看次数

memcpy在linux中移动128位

我正在linux中为PCIe设备编写设备驱动程序.此设备驱动程序执行多次读写操作以测试吞吐量.当我使用memcpy时,TLP的最大有效载荷是8个字节(在64位架构上).在我看来,获得16字节有效载荷的唯一方法是使用SSE指令集.我已经看到了这个,但代码没有编译(AT&T/Intel语法问题).

  • 有一种方法可以在linux中使用该代码吗?
  • 有谁知道我在哪里可以找到一个移动128位的memcpy的实现?

c linux assembly sse simd

3
推荐指数
2
解决办法
2001
查看次数

为什么GCC __builtin_prefetch没有提高性能?

我正在编写一个程序来分析社交网络图.这意味着程序需要大量的随机内存访问.在我看来,预取应该有所帮助.这是从顶点的邻居读取值的一小段代码.

for (size_t i = 0; i < v.get_num_edges(); i++) {
    unsigned int id = v.neighbors[i];
    res += neigh_vals[id];
}
Run Code Online (Sandbox Code Playgroud)

我将上面的代码转换为下面的代码,并预取顶点的邻居值.

int *neigh_vals = new int[num_vertices];

for (size_t i = 0; i < v.get_num_edges(); i += 128) {
    size_t this_end = std::min(v.get_num_edges(), i + 128);
    for (size_t j = i; j < this_end; j++) {
        unsigned int id = v.neighbors[j];
        __builtin_prefetch(&neigh_vals[id], 0, 2);
    }
    for (size_t j = i; j < this_end; j++) {
        unsigned int id = v.neighbors[j];
        res …
Run Code Online (Sandbox Code Playgroud)

c performance gcc prefetch

2
推荐指数
1
解决办法
1559
查看次数

标签 统计

c ×3

avx ×2

simd ×2

assembly ×1

bandwidth ×1

c++ ×1

gcc ×1

linux ×1

memory ×1

openmp ×1

optimization ×1

performance ×1

prefetch ×1

sse ×1

x86 ×1