Использую 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(;;)...
}