检查 MPI 中的进程数是否为 2 的幂
Check number of processes in MPI for power of two
抱歉,如果这是一个愚蠢的问题,但我只想知道下面的 if 语句的实际含义是什么。
int rank, numprocs;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size( MPI_COMM_WORLD, &numprocs );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
if( numprocs&(numprocs-1) )
{
if( rank==0 ) printf( "numprocs must be a power of 2.\n" );
MPI_Finalize();
return EXIT_FAILURE;
}
有人告诉我 "numprocs&(numprocs-1)" 用于检查 numprocs 是否是 2 的幂,但它实际上是如何工作的?语句的输出是什么?它是布尔值还是整数?
谢谢。
&
运算符是按位与运算符。
如果numprocs
是2的幂,其二进制表示将恰好包含一个位为1的位。
例如,如果numprocs = 16
,numprocs - 1 = 15
,它们的AND将为零,因为减法中的借位发生在从LSB到值为1的位。
10000 (16)
& 01111 (15)
------------
00000 ( 0)
相反,如果numprocs
是正数而不是2的幂,其二进制表示将包含多个位为1的位。
例如numprocs = 20
,numprocs - 1 = 19
和减法借位会在到达最高位之前停止,所以值为1的位保留下来,结果不会为零。
10100 (20)
& 10011 (19)
------------
10000 (16)
结果是int
。 if
C 中的语句会将零视为假,将非零视为真。
抱歉,如果这是一个愚蠢的问题,但我只想知道下面的 if 语句的实际含义是什么。
int rank, numprocs;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size( MPI_COMM_WORLD, &numprocs );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
if( numprocs&(numprocs-1) )
{
if( rank==0 ) printf( "numprocs must be a power of 2.\n" );
MPI_Finalize();
return EXIT_FAILURE;
}
有人告诉我 "numprocs&(numprocs-1)" 用于检查 numprocs 是否是 2 的幂,但它实际上是如何工作的?语句的输出是什么?它是布尔值还是整数?
谢谢。
&
运算符是按位与运算符。
如果numprocs
是2的幂,其二进制表示将恰好包含一个位为1的位。
例如,如果numprocs = 16
,numprocs - 1 = 15
,它们的AND将为零,因为减法中的借位发生在从LSB到值为1的位。
10000 (16)
& 01111 (15)
------------
00000 ( 0)
相反,如果numprocs
是正数而不是2的幂,其二进制表示将包含多个位为1的位。
例如numprocs = 20
,numprocs - 1 = 19
和减法借位会在到达最高位之前停止,所以值为1的位保留下来,结果不会为零。
10100 (20)
& 10011 (19)
------------
10000 (16)
结果是int
。 if
C 中的语句会将零视为假,将非零视为真。