OpenMP中预先分配的私有std :: vector并行化为C中的循环
发布时间:2020-12-15 02:47:35 所属栏目:Java 来源:网络整理
导读:我打算使用缓冲区std :: vector size_t缓冲区(100),在循环并行化的每个线程中有一个,如此代码所示: std::vectorsize_t buffer(100);#pragma omp parallel for private(buffer)for(size_t j = 0; j 10000; ++j) { // ... code using the buffer ...} 此代码
我打算使用缓冲区std :: vector< size_t>缓冲区(100),在循环并行化的每个线程中有一个,如此代码所示:
std::vector<size_t> buffer(100); #pragma omp parallel for private(buffer) for(size_t j = 0; j < 10000; ++j) { // ... code using the buffer ... } 此代码不起作用.虽然每个线程都有一个缓冲区,但它们的大小为0. 如何在每个线程的开头分配缓冲区?我还可以使用#pragma omp parallel吗?我可以比这更优雅地做到这一点: std::vector<size_t> buffer; #pragma omp parallel for private(buffer) for(size_t j = 0; j < 10000; ++j) { if(buffer.size() != 100) { #pragma omp critical buffer.resize(100); } // ... code using the buffer ... } 解决方法
拆分OpenMP区域,如
this question所示.
然后在外部区域内声明向量,但在for循环本身之外.这将为每个线程创建一个本地向量. #pragma omp parallel { std::vector<size_t> buffer(100); #pragma omp for for(size_t j = 0; j < 10000; ++j) { { // ... code using the buffer ... } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |