ham*_*els 5 c++ parallel-processing vector openmp
我想std::vector<int>用openmp 填充零。如何快速做到这一点?
我听说循环遍历向量将每个元素设置为零很慢,而且std::fill快得多。现在还是这样吗?
将std :: vector <int>的每个值重置为0的最快方法
我是否必须手动将std::vector<int>区域划分为多个区域,#pragma omp for在每个线程上使用循环,然后std::fill在循环中使用?
您可以将向量分为多个块,以供每个线程填充std::fill:
#pragma omp parallel
{
auto tid = omp_get_thread_num();
auto chunksize = v.size() / omp_get_num_threads();
auto begin = v.begin() + chunksize * tid;
auto end = (tid == omp_get_num_threads() -1) ? v.end() : begin + chunksize);
std::fill(begin, end, 0);
}
Run Code Online (Sandbox Code Playgroud)
您可以通过四舍五入chunksize到最接近的高速缓存行/内存字大小(128字节= 32 ints)来进一步改善它。假设v.data()对齐方式相似。这样,您可以避免任何错误的共享问题。
在双插槽24核心Haswell系统上,我得到了大约9倍的加速:1个线程3.6s,24个线程0.4s,4.8B int =〜48 GB / s,结果有些不同,但这不是科学的分析。但这离系统的内存带宽不太远。
为了获得良好的性能,您不仅应考虑将向量划分为该操作,而且还应尽可能以其他方式划分其他向量(无论是读取还是写入)。这样,如果需要数据,或者至少在同一NUMA节点上,可以增加数据实际在缓存中的机会。
奇怪的是,在我的系统std::fill(..., 1);上比std::fill(..., 0)单线程要快,但对24个线程要慢。两者均使用gcc 6.1.0和icc 17.0.1。我想我会将其发布到一个单独的问题中。
| 归档时间: |
|
| 查看次数: |
872 次 |
| 最近记录: |