我對使用 OpenMP 和 stackoverflow 還是很陌生,所以如果這是一個愚蠢的問題,我深表歉意!
我正在嘗試設定一個大的二維向量來測驗我的 CUDA 程式。這些大向量的創建是通過回圈遍歷給定維度的所有值(存盤在它們自己的向量中)并在新向量中創建一行來完成的,涵蓋所有可能的排列。顯然,隨著維度數量的增加,執行此操作所需的時間呈指數增長,因此我希望對其進行并行化。
最初我認為問題可能是 OpenMP 和 Thrust 庫 host_vectors 之間的不兼容,所以我切換到使用法線向量,問題仍然存在。這是完整的功能:
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中的以下函式,但它的含義超出了我的范圍:
_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;
}
}
任何幫助將不勝感激。謝謝!
uj5u.com熱心網友回復:
您的問題出在“final2.push_back(temp)”行上。您有多個執行緒推回同一個向量。這是不可能的。在回圈之前創建向量,然后寫入其中的顯式位置。
一般來說,盡量避免push_back,因為它有性能問題。如果您知道向量的大小,請使用該大小創建它。科學應用幾乎不需要push_back.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/382467.html
下一篇:靜默標準輸出/標準錯誤
