想象一下,在并行区域中有一个嵌套循环,如:
#pragma omp parallel
{
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
或
#pragma omp parallel
{
for (int i = 0, ...) {
for (int j = i, ...) { }}}
如果我们使用#pragma omp,则i索引会自动变为私有。但是......我们是否需要将j索引设置为私有或公共?有什么影响?
#pragma omp parallel
{
#pragma omp for shared(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
或
#pragma omp parallel
{
#pragma omp for private(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
提前致谢!
答案 0 :(得分:2)
并行区域内声明的所有内容都是自动隐私的。这(大概)是你想要的行为:i
的每次迭代都应循环遍历所有j
,j
循环都是独立的(因此是私有的,而不是公共的)。但是,您实际上缺少重要的parallel
部分:如果您不写
#pragma omp parallel for
但仅
#pragma omp for
然后你不会并行发生任何事情(除非你首先在一个封闭的范围内创建了一个#pragma omp parallel
的并行区域)!
答案 1 :(得分:1)
私有j没有效果,因为默认情况下j是私有的(因为它在i for循环中作用域,因此当创建新线程时j是特定于该线程的
services.AddSingleton<IAuthorizationHandler, IsAllowedAccessToA<RequirementA_OR_B>>();
services.AddSingleton<IAuthorizationHandler, IsAllowedAccessToB<RequirementA_OR_B>>();
如果你使用#pragma omp parallel for private(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}
它应该没有上面所述的效果,因为j的范围是i的每个实例的本地范围,如果你将j的范围扩展到全局,你将遇到一个种族密码