如何计算CMake文件中的功率指数
How to calculate power index in CMake file
我正在处理使用 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-loops 合并为一个 for-loop。
这在 CMake 中可行吗?
如果我没理解错的话,您要计算给定大小的 2 的幂的 指数 分量:
32, 64, 128, 256, 512
这些是 2 的幂,对应的指数为:
5, 6, 7, 8, 9
我们可以计算出来。
不幸的是,CMake 支持的 math()
function does not support exponential arithmetic. But luckily, powers of two are easy to manipulate using bit-shifting。我们可以创建一个简单的 CMake 函数来计算用于导出大小 32, 64, 128, etc
.
的(2 次幂)指数
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()
您似乎想成对迭代这些大小和指数值。我们可以设置一个 list 的大小来迭代,并计算相应的指数。
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
我正在处理使用 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-loops 合并为一个 for-loop。
这在 CMake 中可行吗?
如果我没理解错的话,您要计算给定大小的 2 的幂的 指数 分量:
32, 64, 128, 256, 512
这些是 2 的幂,对应的指数为:
5, 6, 7, 8, 9
我们可以计算出来。
不幸的是,CMake 支持的 math()
function does not support exponential arithmetic. But luckily, powers of two are easy to manipulate using bit-shifting。我们可以创建一个简单的 CMake 函数来计算用于导出大小 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()
您似乎想成对迭代这些大小和指数值。我们可以设置一个 list 的大小来迭代,并计算相应的指数。
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