gpt4 book ai didi

c++ - 并行化 STXXL 容器

转载 作者:行者123 更新时间:2023-11-28 06:23:14 26 4
gpt4 key购买 nike

我正在尝试使用 STXXL 构建一个大型矩阵,并能够对该矩阵执行多种不同的操作。目前,我正在使用 stxxl::vector 作为存储大矩阵子矩阵的一种方式。我想要做的是规范化矩阵的每一列。所以我唯一的数据依赖应该在列中。当我尝试使用 openmp 并行化对子矩阵的访问时,我收到错误消息

[STXXL-ERRMSG] WRITE request submitted for a BID with a pending READ request

一遍又一遍。我对 STXXL 的线程安全有什么误解吗?因为我所做的不应该访问同一个子矩阵。这是我尝试调试和运行的示例代码:

#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

最佳答案

访问同一个 vector 不是线程安全的。想一想 vector 的作用:它是一个复杂的分页系统,并且不是线程安全的。

关于c++ - 并行化 STXXL 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28993771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com