【问题标题】:How to calculate power index in CMake file如何计算 CMake 文件中的功率指数
【发布时间】:2020-02-05 14:34:24
【问题描述】:

我正在处理使用 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 中可行吗?

【问题讨论】:

  • 您能否提供一个更具体的示例来说明所需的行为?这个应该做什么?因为size_wpowerof2_w 参数不是列表,所以每个循环只会有一次迭代...
  • 由于共享我的数据的限制,我想解释一下size_w是我的块的宽度。在我的代码中,我正在计算 power_of_2 参数。它在我的代码中的名称不同。但我只需要从 cmake 发送该值,因为我不想在我的源文件中计算该参数。
  • 这里 size_w 正在从 32 ,64,128,256,512 ....so powerof2_w 更改为:5,6,7,8,9
  • @squareskittles,是否可以将这个 (32 ,64,128,256,512) 和 (5,6,7,8,9) 循环组合成一个循环,但需要进行一些条件检查。
  • @squareskittles,但是这对 (32 : 5) , (64:6) , (128:7) , (256:8) , (512:9) 应该是这样的

标签: foreach cmake exponentiation


【解决方案1】:

如果我理解正确,您正在寻找为给定尺寸计算 2 的幂的 指数 分量:

32, 64, 128, 256, 512

这些是 2 的幂,对应的指数为:

5, 6, 7, 8, 9

我们可以计算。

很遗憾,CMake 的 math() 函数不支持指数运算。但幸运的是,使用 CMake 支持的 bit-shifting 可以轻松操作 2 的幂。我们可以创建一个简单的 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()

您似乎想成对地遍历这些大小和指数值。我们可以设置一个 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

【讨论】:

  • 是的..这就是我正在寻找的 .Shift 操作。非常感谢。
猜你喜欢
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
相关资源
最近更新 更多