2013-10-25 3 views
0

Мне нужна функция в cuda, которая получает массив символов и если они совпадают, функция возвращает значение, но когда я проверяю этот код, всегда возвращайте 0, как ни одно из этих условий не соответствует. до сих пор я пробовал это:Как сравнить массивы char в CUDA C++?

__device__ float operate_1(float num, char func[]) { 

     if(func[0] == 's' && func[1] == 'i' && func[2] == 'n' ) 

      return sinf(num * PI/180.0); 

     else if(func[0] == 'c' && func[1] == 'o' && func[2] == 's' ) 

      return cosf(num * PI/180.0); 

     else if(func[0] == 'l' && func[1] == 'o' && func[2] == 'g' ) 

      return logf(num); 

     else if(func[0] == 'e') 

      return expf (num); 

     return 0; } 
     //evaluates an operator. 

и этот код тоже, но не работает как предыдущий.

__device__ float operate_1(float num, char func[]) { 

     if(func == "sin") 

      return sinf(num * PI/180.0); 

     else if(func == "cos") 

      return cosf(num * PI/180.0); 

     else if(func == "log") 

      return logf(num); 

     else if(func == "e") 

      return expf (num); 

     return -0; } 
     //evaluates an operator. 

что я могу сделать?

+0

Это выглядит так - вы разборе кода на стороне графического процессора CUDA, если это так, почему? Первый пример должен работать, если вы запомнили, что вы загружаете массив char в cuda-mem. –

+0

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

+0

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

ответ

2

Как об этом:

__device__ int my_strcmp(const char *str_a, const char *str_b, unsigned len = 256){ 
    int match = 0; 
    unsigned i = 0; 
    unsigned done = 0; 
    while ((i < len) && (match == 0) && !done){ 
    if ((str_a[i] == 0) || (str_b[i] == 0)) done = 1; 
    else if (str_a[i] != str_b[i]){ 
     match = i+1; 
     if ((int)str_a[i] - (int)str_b[i]) < 0) match = 0 - (i + 1);} 
    i++;} 
    return match; 
    } 
Смежные вопросы