@SergeySerge11

Gpu вычисления, groupId theradId gridId что означают, как пользоваться?

Использую ILGPU, и еще ComputeSharp CudaManager, там везде в принципе все похоже.
Хочу понять какие есть техи.

Как написать самый быстрый в мире код суммы 2 массивов.

Вот для аналогии приведу пример Самого медленного кода в мире.
На GPU вычисления по дефолту типа Такой аналогии???
Parallel.For(0, nn, i => arr1[i] += arr2[i]);


Типичная функция gpu вычислений в любой документации, Один в один как самый медленный код.
// Kernel definition
__global__ void VecAdd(float* A, float* B, float* C)
{
    int i = threadIdx.x;
    C[i] = A[i] + B[i]; 
}

Это же тоже самое. мелкая функция будет вычисляется. да еще наверное, не использует локальность данных.
Как вот эту функции из документации оптимизировать до предела?
То есть вставить туда
__global__ void VecAdd(float* A, float* B, float* C)
{
    int i = threadIdx.x;
    for( ? ; ? ; ? )
          C[i] = A[i] + B[i]; 
}

Там есть вот эти group grid thead block id X,Y,Z измерениях. И страшно даже перебирать все варианты.
Зачем они вообще нужны. Кто это придумал, зачем. Почему нельзя, как Везде, и всегда на CPU.
Просто передать индекс, ну может еще множитель и уже самому вычислить регион внутри регион, это же и проще и понятнее
__global__ void VecAdd(  int index,   int len,  float* A, float* B, float* C)
{   
     int beg=index*len;
     int end=beg+len;
     for(;;)...
}
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы