小编Ben*_*min的帖子

C++ for循环中的无符号整数

我在Stackoverflow上对C++中的反向循环进行了一些研究,它使用无符号整数而不是有符号整数.但我仍然不明白为什么会出现问题(请参阅带有for循环的Unsigned int反向迭代).为什么以下代码会产生分段错误?

#include <vector>
#include <iostream>
using namespace std;

int main(void)
{
    vector<double> x(10);

    for (unsigned int i = 9; i >= 0; i--)
    {
        cout << "i= " << i << endl;
        x[i] = 1.0;
    }

    cout << "x0= " << x[0] << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我明白问题是当索引i等于零时,因为有类似溢出的东西.但我认为无符号整数可以取零值,不是吗?现在,如果我用有符号整数替换它,那绝对没有问题.

有人能用无符号整数向我解释反向循环背后的机制吗?

非常感谢你!

c++ for-loop unsigned-integer

11
推荐指数
2
解决办法
2万
查看次数

OpenMP和核心/线程

我的CPU是Core i3 330M,有2个内核和4个线程.当我/proc/cpuinfo在终端中执行命令cat 时,就好像我有4个CPUS.当我使用OpenMP功能时,get_omp_num_procs()我也得到4.

现在我有一个标准的C++矢量类,我的意思是一个不使用表达式模板的固定大小的双数组类.我仔细并行化了我班级的所有方法,并获得了"预期"的加速.

问题是:在这么简单的情况下,我能猜出预期的加速吗?例如,如果我添加两个没有并行化for循环的向量,我会得到一些时间(使用shell time命令).现在,如果我使用OpenMP,根据内核/线程的数量,我应该将时间除以2或4吗?我强调我只是要求这个特别简单的问题,即数据中没有相互依赖性,一切都是线性的(向量加法).

这是一些代码:

Vector Vector::operator+(const Vector& rhs) const
{
    assert(m_size == rhs.m_size);
    Vector result(m_size);
    #pragma omp parallel for schedule(static)
    for (unsigned int i = 0; i < m_size; i++) 
            result.m_data[i] = m_data[i]+rhs.m_data[i];

    return result;
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读过这篇文章:OpenMP线程映射到物理核心.

我希望有人会告诉我更多有关OpenMP如何在这个简单案例中完成工作的信息.我应该说我是并行计算的初学者.

谢谢!

c++ parallel-processing cpu openmp memory-bandwidth

5
推荐指数
1
解决办法
2163
查看次数