我正在尝试使用STXXL构建大型矩阵,并能够对矩阵执行几种不同的操作。目前,我正在使用stxxl::vector
作为存储大型矩阵的子矩阵的方法。我正在尝试做的是规范化矩阵的每一列。因此,我唯一的数据依赖项应在列中。当我尝试使用openmp并行化对子矩阵的访问时,出现错误消息
[STXXL-ERRMSG]提交的BID的WRITE请求未决读
请求
再三,一而再再而三。我对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
最佳答案
访问同一向量不是线程安全的。考虑一下向量的作用:这是一个精心设计的分页系统,并且不是线程安全的。