如何在CMake文件中计算功率指数



我正在研究使用ctest的 CMake 单元测试用例。

我在这里有一个问题。

我的CMake的某些部分如下:

set(size_w   32  )
set(powerof2_w  5 )
foreach(size  ${size_w})
foreach(pwr_of_2  ${powerof2_w})
...
FUNCTION_EXE(${size} ${pwr_of_2})
endforeach(pwr_of_2)
endforeach(size)
set(size_w   64  )
set(powerof2_w  6 )
foreach(size  ${size_w})
foreach(pwr_of_2  ${powerof2_w})
...
FUNCTION_EXE(${size} ${pwr_of_2})
endforeach(pwr_of_2)
endforeach(size)
set(size_w   128  )
set(powerof2_w  7 )
foreach(size  ${size_w})
foreach(pwr_of_2  ${powerof2_w})
...
FUNCTION_EXE(${size} ${pwr_of_2})
endforeach(pwr_of_2)
endforeach(size)
set(size_w   256  )
set(powerof2_w  8 )
foreach(size  ${size_w})
foreach(pwr_of_2  ${powerof2_w})
...
FUNCTION_EXE(${size} ${pwr_of_2})
endforeach(pwr_of_2)
endforeach(size)

期望:

我想减少带有powerof2_w参数的一个循环:

foreach(pwr_of_2  ${powerof2_w})

是否可以从foreach(size ${size_w})for 循环本身内部的size_w参数计算pwr_of_2参数?

注意:另外,我想使用数组索引将所有这四个 for 循环组合成一个for 循环

这在CMake中可能吗?

如果我理解正确,您希望计算给定大小的 2 次幂的指数分量:

32, 64, 128, 256, 512

这些是 2 的幂,具有相应的指数:

5, 6, 7, 8, 9

我们可以计算。

不幸的是,CMake 的math()函数不支持指数算术。但幸运的是,使用位移很容易操纵 2 的幂,CMake 支持位移。我们可以创建一个简单的 CMake 函数来计算用于推导出大小的指数(2 的幂32, 64, 128, etc

function(calc_power_of_two_exponent num exponent)
set(counter 0)
# Shift until our number equals 1.
while(num GREATER 1)
# Right shift by 1
math(EXPR num "${num} >> 1")
# Count the number of times we shift.
math(EXPR counter "${counter} + 1")
endwhile()
# Return the number of times shifted, which is the exponent.
set(exponent ${counter} PARENT_SCOPE)
endfunction()

看起来您想成对遍历这些大小和指数值。我们可以设置一个要迭代的大小列表,并随时计算相应的指数。

set(sizes 32 64 128 256 512)
# Iterate through each size.
foreach(size ${sizes})
# Call the function to calculate its base-2 power (or index).
calc_power_of_two_exponent(${size} exponent)
message(STATUS "${size} ${exponent}")
FUNCTION_EXE(${size} ${exponent})
endforeach(size)

状态message可用于确认我们将正确的值传递给FUNCTION_EXE函数。此代码打印:

32 5
64 6
128 7
256 8
512 9

最新更新