Распараллеливание контейнера STXXL

Я пытаюсь использовать STXXL для построения большой матрицы и иметь возможность выполнять несколько различных операций над матрицей. В настоящее время я использую stxxl::vector как способ хранения подматриц моей большой матрицы. То, что я пытаюсь сделать, это нормализовать каждый столбец матрицы. Так что моя единственная зависимость от данных должна быть в столбцах. Когда я пытаюсь использовать openmp для распараллеливания доступа к подматрицам, я получаю сообщение об ошибке

[STXXL-ERRMSG] Запрос WRITE отправлен для BID с ожидающим запросом READ

снова и снова. Я что-то неправильно понимаю в безопасности потоков 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

1 ответ

Доступ к одному и тому же вектору не является потокобезопасным. Подумайте о том, что делает вектор: это сложная система подкачки, которая не поточно-ориентирована.

Другие вопросы по тегам