OpenMP 并行 for 循环异常
OpenMP parallel for loop exceptions
我对使用 OpenMP 和 Whosebug 还很陌生,如果这是一个愚蠢的问题,我深表歉意!
我正在尝试设置一个大型二维矢量来测试我的 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;
}
它不会立即中断,它会在抛出异常之前打印出多次迭代,给出以下信息:
Exception thrown: read access violation. this->_Myproxy was
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;
}
}
如有任何帮助,我们将不胜感激。谢谢!
您的问题出在“final2.push_back(temp)”这一行。您有多个线程推回同一个向量。这是不可能的。在循环之前创建向量,然后写入其中的显式位置。
一般来说,尽量避免push_back
,因为它有性能问题。如果您知道向量的大小,请使用该大小创建它。科学应用几乎不需要 push_back
.
的动态性
我对使用 OpenMP 和 Whosebug 还很陌生,如果这是一个愚蠢的问题,我深表歉意!
我正在尝试设置一个大型二维矢量来测试我的 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;
}
它不会立即中断,它会在抛出异常之前打印出多次迭代,给出以下信息:
Exception thrown: read access violation. this->_Myproxy was 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;
}
}
如有任何帮助,我们将不胜感激。谢谢!
您的问题出在“final2.push_back(temp)”这一行。您有多个线程推回同一个向量。这是不可能的。在循环之前创建向量,然后写入其中的显式位置。
一般来说,尽量避免push_back
,因为它有性能问题。如果您知道向量的大小,请使用该大小创建它。科学应用几乎不需要 push_back
.