首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >并行化STXXL容器

并行化STXXL容器
EN

Stack Overflow用户
提问于 2015-03-11 17:46:28
回答 1查看 223关注 0票数 0

我试图使用STXXL来构建一个大型的矩阵,并且能够在这个矩阵上执行几个不同的操作。目前,我正在使用stxxl::vector作为存储大型矩阵的子矩阵的方法。我想要做的是规范矩阵的每一列。因此,我唯一的数据依赖项应该在列中。当我尝试使用openmp并行化对子矩阵的访问时,我会得到错误消息。

STXXL-ERRMSG以待决读取请求提交投标的写入请求

一遍又一遍。我是不是误解了STXXL的线程安全?因为我所做的不应该是访问相同的子矩阵。下面是我要调试和运行的示例代码:

代码语言:javascript
复制
#include <iostream>
#include <stxxl/vector>

#define FEATURE_LENGTH 128
#define PARTITION_SIZE 16

typedef stxxl::VECTOR_GENERATOR<int>::result vec;

using namespace std;

struct MyMatrix
{
    float A[FEATURE_LENGTH*PARTITION_SIZE];
};

int main()
{
    const int N = (1 << 20);
    stxxl::vector<MyMatrix> C;
    for (int n = 0; n < N; ++n) {
        MyMatrix A;
        for (size_t j = 0; j < PARTITION_SIZE; ++j) {
            for (size_t i = 0; i < FEATURE_LENGTH; ++i) {
                A.A[j*FEATURE_LENGTH + i] = n;
            }
        }
        if (n == 0) {
            std::cout << "sizeof(A) = " << sizeof(A) << std::endl;
        }
        C.push_back(A);
    }

    #pragma omp parallel for shared(C)
    for (unsigned long long m = 0; m < C.size(); ++m) {
        for (int j = 0; j < PARTITION_SIZE; ++j) {
            MyMatrix& C_m = C[m];
            float sum = 0;
            for (int i = 0; i < FEATURE_LENGTH; ++i) {
                sum += C_m.A[j*FEATURE_LENGTH + i];
            }
            if (sum != 0) {
                for (int i = 0; i < FEATURE_LENGTH; ++i) {
                    C_m.A[j*FEATURE_LENGTH + i] /= sum;
                }
            }
        }
    }
    return 0;
}

我正在运行的CXX标志是

-fopenmp -W -Wall -std=c++11 -O3

EN

回答 1

Stack Overflow用户

发布于 2015-03-12 06:57:04

对同一向量的访问不是线程安全的.想一想向量的作用:它是一个复杂的分页系统,而这并不是线程安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28993771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档