Как рассчитать индекс мощности в файле CMake - PullRequest
0 голосов
/ 05 февраля 2020

Я работаю над модульными тестами CMake, использующими ctest.

У меня здесь один вопрос.

Некоторая часть моего 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)

Ожидание:

Я хочу уменьшить это значение l oop с параметром powerof2_w:

foreach(pwr_of_2  ${powerof2_w})

Можно ли рассчитать параметр pwr_of_2 из параметра size_w внутри foreach(size ${size_w}) для -l oop само по себе?

Примечание. Кроме того, я хочу объединить все четыре из этих for-loop в один for-l oop, используя индекс массива.

Возможно ли это в CMake?

1 Ответ

3 голосов
/ 05 февраля 2020

Если я правильно понимаю, вы хотите рассчитать экспоненциальный компонент для степеней двух для заданных размеров:

32, 64, 128, 256, 512

Это степени двойки с соответствующими показателями :

5, 6, 7, 8, 9

, который мы можем рассчитать.

К сожалению, функция CMake math() не поддерживает экспоненциальную арифметику c. Но, к счастью, двумя степенями легко манипулировать, используя bit-shift , который поддерживается в 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()

Похоже, вы хотите перебирать значения этих размеров и показателей в парах. Мы можем установить список размеров для итерации и вычислить соответствующий показатель степени, как мы go.

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
...