2013-08-14 4 views
1

Я написал код, предназначенный для очень быстрых вычислений. Я предполагаю, что знаю определенное число (потому что я могу смело предположить, что это < 15 и> 2. Не очень хороший способ реализовать что-то, но он позволяет разворачивать цикл и делает код намного быстрее)Несколько копий одной и той же функции в C

(Код был написан этот способ для практических соображений. Я знаю, что это не очень хороший способ написать код, но в этом случае так оно и должно быть)

Проблема: мне нужно изменить номер в #define и скомпилировать снова и снова для каждого значения (с использованием Visual C++ 2010)

Я понял, что макросы могут быть способом, но я не мог понять, как это сделать. мой хромой попытка подали:

#define myCustomFunc(number) void myF_number() \ 
       { printf("%d",number); \ 
       } 

моя цель состоит в том, что что-то вроде этого:

create_myfunc(2); 
create_myfunc(3); 
create_myfunc(4); 

будет расширяться:

void myFunc_2(...) 
{ ... #pragma unroll 
for (int i<0; i<2;i++) 
... 
} 
    void myFunc_3(...) 
{ ... #pragma unroll 
for (int i<0; i<3;i++) 
... 
} 

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

if (x==2) 
    myFunc_2(); 

Но из того, что я понимаю, одна из проблем при выполнении такой вещи заключается в том, что такой код не расширяется, если он не находится внутри функции, просто дает ошибку.

+2

Почему кто-то хочет сделать такую ​​ужасную вещь ?! Независимо от вашей внешней проблемы, это не способ ее решения. Это затмевает простоту вашего кода. –

+0

Кроме того, вы, вероятно, ошибаетесь в том, что цикл разворачивается, делая код быстрее. С отдельными развернутыми функциями у вас будет больше инструкций для извлечения и декодирования, использования большего количества кэша инструкций и в зависимости от того, что в коде, возможно, даже с более ошибочными ветвями и других подобных штрафов. –

+0

Мой код не должен быть простым, он должен быть быстрым. Это написано в CUDA. Я не эксперт-программист, но я понимаю, что разворот цикла очень хорош в CUDA. Поверьте мне, я тоже этого не люблю, но мне нужен быстрый код, и это не нужно обобщать или использовать никем, кроме меня. – user1999728

ответ

3

Вы можете использовать параметр макроса в имени функции.

#define create_myfunc(number) \ 
void myFunc_##number(...) \ 
{ \ 
#pragma unroll \ 
for (int i = 0; i < number; i++) \ 
} 

Обратите внимание, что я изменил I < 0 до I = 0. Было ли это предназначено?

3

Вы можете сохранить все указатели на функции в массиве, а затем вызвать соответствующую функцию с индексом массива.

Кроме того, если все оптимизированные функции допускают такой взлом, вы можете написать свою собственную функцию в ассемблере, которая охватывает все ваши случаи.

+0

Я просто понял, что отвечаю на неправильный вопрос, но ответ может быть полезен. – Dialecticus

+0

Мне было полезно. Спасибо вам обоим :) – user1999728

Смежные вопросы