Войти
ПрограммированиеФорумОбщее

Fermi,Cuda, Рекурсия

#0
8:38, 17 июня 2010

На GTX480 можно  вычистлить функцию Аккермана

__device__ __host__ unsigned int naive_ackermann(unsigned int m, unsigned int n) {

  if (m == 0)
    return n + 1;
  else if (n == 0)
    return naive_ackermann(m - 1, 1);
  else
    return naive_ackermann(m - 1, naive_ackermann(m, n - 1));
}
Для каждого потока можно выделить 49152 байт,для чего потребуется 15*48*32*49152=1132462080 байт в видео памяти.
Изображение
Для 3Gb видео памяти можно выделит 98304 байт на поток,для  6Gb видео памяти можно выделит 196608 байт на поток.

Можно выделить,в данном случае, максимум байт  на поток,по формуле: FreeVideoMemory/(15*48*(32+2));


#1
9:57, 17 июня 2010

ииии?

#2
10:49, 17 июня 2010

Вычисление 2 в 30 степени в 2.34 медление ,если использовать рекурсию

__device__ __host__ int pow_recursion(int value,int n)
{
  if(n == 0) return 1;
  return value * pow_recursion(value,n-1); 
}
__device__ __host__ int pow(int value,int n)
{
  int tmp = 1;
  for(;n>0;n--)
    tmp = tmp * value;
  return tmp;
}
Current stack size of each GPU thread  : 1024

Set stack size of each GPU thread equal 56571

Current stack size of each GPU thread  : 56576

gpu pow_recursion : 1073741824
elapsedTime 0.011232

gpu pow : 1073741824
elapsedTime 0.004800

#3
11:12, 17 июня 2010

Понятно ) Психи атакуют )))

#4
13:07, 18 июня 2010

BringerOfDawn
Слушай, а функторы есть то, как работают?

#5
14:39, 18 июня 2010

_vasa_
> Слушай, а функторы есть то, как работают?
Так как,device-function pointers не поддерживются,то можно использовать функторы.
Например :

class Add 
{ 
public: 
  __device__ 
  float 
  operator() (float a, float b) 
  const 
  { 
    return a + b; 
  } 
};
 
class Sub 
{ 
public: 
  __device__ 
  float
  operator() (float a, float b) 
  const 
  { 
    return a - b; 
  } 
}; 
// Device code 
template<class O> 
__global__ 
void 
VectorOperation(const float * A, const float * B,
         float * C, unsigned int N, O op) 
{ 
  unsigned int iElement = blockDim.x * blockIdx.x + threadIdx.x; 
  if (iElement < N) 
  { 
    C[iElement] = op(A[iElement], B[iElement]); 
  }
}
// Host code 
VectorOperation<<<blocks, threads>>>(v1, v2, v3, N, Add());
#6
14:53, 18 июня 2010

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

#7
14:54, 18 июня 2010

о чем этот тред?

#8
15:56, 18 июня 2010

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

Из Функтор  (программирование) — Википедия.
Фу́нктор (англ. function object) — концепция программирования, позволяющая использовать объект класса как функцию. Как правило, функторы используются для написания callback-функций.
C++ функтор создаётся с помощью класса, у которого перегружен operator():

class compare_class {
  public:
  bool operator()(int A, int B) {
    return (A < B);
  }
};
 
// объявление функции сортировки
template <class ComparisonFunctor> 
void sort_ints(int* begin_items, int num_items, ComparisonFunctor c);
 
int main() {
    int items[] = {4, 3, 1, 2};
    compare_class functor;
    sort_ints(items, sizeof(items)/sizeof(int), functor);
}

#9
18:55, 18 июня 2010

BringerOfDawn
ну это все понятно, но одно дело подставить код на этапе компиляции, а другое дело - позвать по указателю
я так понимаю, вопрос был именно про работу вызовов через указатель, который определяется в момент исполнения (vtbl)
через шаблоны можно было и раньше делать

#10
19:14, 18 июня 2010

evirus
> ну это все понятно, но одно дело подставить код на этапе компиляции, а другое
> дело - позвать по указателю
> я так понимаю, вопрос был именно про работу вызовов через указатель, который
> определяется в момент исполнения (vtbl)
> через шаблоны можно было и раньше делать

В документации к CUDA Toolkit 3.1 написано временное отсутствие виртуальных функций.

"
D.6 Classes

      Code compiled for devices with compute capability 2.0 and greater may make use of C++
      classes, as long as none of the member functions are virtual (this restriction will be removed in
      some future release).
...
"

#11
21:28, 18 июня 2010

BringerOfDawn
спасибо за информацию

#12
0:04, 21 июня 2010

BringerOfDawn
Виртуальные функции понятно, нету. А обычный указатель на device-функцию, не принадлежащую какому-либо классу, можно взять или нет, ну и вызвать ее естественно? В той же cuda 3.1 например.

Про рекурсию. Если есть рекурсия то должно быть переполнение стека :)
Нечто подобное случалось тут или нет?

ПрограммированиеФорумОбщее

Тема в архиве.