簡體   English   中英

OpenMP 並行 for 循環異常

[英]OpenMP parallel for loop exceptions

我對使用 OpenMP 和 stackoverflow 還是很陌生,如果這是一個愚蠢的問題,我深表歉意!

我正在嘗試設置一個大型二維向量來測試我的 CUDA 程序。 這些大向量的創建是通過循環遍歷給定維度的所有值(存儲在它們自己的向量中)並在新向量中創建一行來完成的,涵蓋所有可能的排列。 顯然,隨着維度數量的增加,執行此操作所需的時間呈指數級增長,因此我希望將其並行化。

本來以為問題可能是OpenMP和Thrust庫host_vectors不兼容,所以改用法線向量,問題依舊。 這是完整的 function:

thrust::host_vector<thrust::host_vector<float>> parallel_create_search_grid(
    thrust::host_vector<float> d1,
    thrust::host_vector<float> d2,
    thrust::host_vector<float> d3,
    thrust::host_vector<float> d4) {

    std::vector<std::vector<float>> final2;

#pragma omp parallel shared(d1, d2, d3, d4, final2)
    {
        int j, k, l;
        std::vector<float> temp(4);
        thrust::host_vector<float> h_temp;

#pragma omp for
        for (int i = 0; i < d1.size(); i++)
        {

            for (j = 0; j < d1.size(); j++)
            {
                for (k = 0; k < d1.size(); k++)
                {
                    for (l = 0; l < d1.size(); l++)
                    {
                        temp[0] = d1[i];
                        temp[1] = d2[j];
                        temp[2] = d3[k];
                        temp[3] = d4[l];

                        std::cout << i << "," << j << "," << k << "," << l << std::endl;

                        final2.push_back(temp);
                    }
                }
            }
        }
    }
    return final2;
}

它不會立即中斷,它會在拋出異常之前打印出許多迭代,給我以下信息:

拋出異常:讀取訪問沖突。 this->_Myproxy 是 0xFFFFFFFFFFFFFFFF。

異常的來源是xmemory中的以下function,但它的含義超出了我的范圍:

_CONSTEXPR20_CONTAINER void _Container_base12::_Swap_proxy_and_iterators_unlocked(_Container_base12& _Right) noexcept {
    _Container_proxy* _Temp = _Myproxy;
    _Myproxy                = _Right._Myproxy;
    _Right._Myproxy         = _Temp;

    if (_Myproxy) {
        _Myproxy->_Mycont = this;
    }

    if (_Right._Myproxy) {
        _Right._Myproxy->_Mycont = &_Right;
    }
}

任何幫助將不勝感激。 謝謝!

您的問題在於“final2.push_back(temp)”行。 您有多個線程推回同一個向量。 這是不可能的。 在循環之前創建向量,然后寫入其中的顯式位置。

一般來說,盡量避免push_back ,因為它有性能問題。 如果您知道向量的大小,請使用該大小創建它。 科學應用幾乎不需要push_back的動態性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM