小编Poc*_*chi的帖子

OpenMP迭代for循环并行区域

对不起,如果标题是一个很大的不清楚.我不太清楚怎么说这个.

我想知道我是否有办法做到以下几点:

#pragma omp parallel
{
    for (int i = 0; i < iterations; i++) {
        #pragma omp for
        for (int j = 0; j < N; j++)
            // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

忽略诸如在for循环中省略私有说明符之类的东西,有什么方法可以在我的外部循环之外分叉线程,这样我就可以并行化内部循环?根据我的理解(如果我错了请纠正我),所有线程都将执行外部循环.我不确定内循环的行为,但我认为for会将块分配给遇到它的每个线程.

我想要做的是不必fork/join iterations次,而只需在外循环中执行一次.这是正确的策略吗?

如果有另一个外环不应该并行化怎么办?那是...

#pragma omp parallel
{

    for (int i = 0; i < iterations; i++) {
        for(int k = 0; k < innerIterations; k++) {
            #pragma omp for
            for (int j = 0; j < N; j++)
                // Do something

            // Do …
Run Code Online (Sandbox Code Playgroud)

c c++ parallel-processing openmp

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

取消引用指针vs转移字节?

我正在尝试提高执行大量操作的应用程序的性能.

一个操作是:

c |= (1 << i)
Run Code Online (Sandbox Code Playgroud)

我想在一个字节中设置一个位.我在考虑使用查找表来获取OR中的每个值.如果数组访问比原始位操作更快或更慢吗?

或许还有更好的方法吗?

c++ performance

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

在运算符中使用`this`

我有这样的事情:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}
Run Code Online (Sandbox Code Playgroud)

CLASS只是一些课程.binop的原型是

CLASS binop(CLASS& left, CLASS& right, OP op);

这一切都很好,并使用Visual C++ 2010进行编译,但在g ++中失败并出现错误:

someheader.h: In member function 'void CLASS::set(int64_t)':
someheader.h:469:29: error: no match for 'operator|' in '*(CLASS*)this | CLASS(bit)'
someheader.h:469:29: note: candidate is:
someheader.h:376:1: note: CLASS CLASS::operator|(CLASS&)
someheader.h:376:1: note:   no known conversion for argument 1 from 'CLASS' to 'CLASS&'
Run Code Online (Sandbox Code Playgroud)

现在,我只是将当前对象(*this)作为一些参数传递出来时遇到了问题,所以我明确地将其删除以删除const指针上的限定符,这很好用,似乎欺骗Visual C++编译器接受它作为一个普通指针.g ++似乎不喜欢这个.如果我删除了强制转换,它仍然会给我一个错误,因为它this是const限定的.我对操作符的左手和右手大小的处理要求两者都是可变的.

从我可以收集的内容来看,似乎我在传递一些对象并将其转换为函数调用中的引用时出现问题......这对我来说没有多大意义.有什么建议?

c++

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

标签 统计

c++ ×3

c ×1

openmp ×1

parallel-processing ×1

performance ×1