Табличная модель служб Analysis Services - новая группировка вычисляемых таблиц (с DAX) по неделям

Как вы его написали, это ядро ​​полностью последовательное. Каждый поток, запущенный для его выполнения, выполняет одну и ту же работу.

Основная идея моделей CUDA (и OpenCL и других подобных «однопроцессорных программ с несколькими данными») заключается в том, что вы выполняете «параллельную работу с данными» - такую, где одна и та же, в значительной степени независимая операция должен выполняться много раз - и писать ядро, которое выполняет эту операцию. Затем для запуска этой операции во входном наборе данных запускается большое количество (полу) автономных потоков.

В примере добавления массива параллельная операция с данными -

C[k] = A[k] + B[k];

для всех k между 0 и 128 * 1024. Каждая операция добавления полностью независима и не имеет требований к порядку, и поэтому может выполняться другой нитью. Чтобы выразить это в CUDA, можно написать такое ядро ​​следующим образом:

__global__ void mAdd(float* A, float* B, float* C, int n)
{
    int k = threadIdx.x + blockIdx.x * blockDim.x;

    if (k < n)
        C[k] = A[k] + B[k];
}

[отказ от ответственности: код, написанный в браузере, не проверенный, использовать на свой страх и риск]

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

const int n = 128 * 1024;
int blocksize = 512; // value usually chosen by tuning and hardware constraints
int nblocks = n / nthreads; // value determine by block size and total work

madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);

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

Все вышеперечисленное чрезвычайно упрощенный обзор парадигмы CUDA для очень тривиальной операции, но, возможно, она дает достаточно понимания для продолжения. В настоящее время CUDA довольно зрелая, и есть много хороших бесплатных учебных материалов, которые можно использовать в Интернете, чтобы, возможно, использовать их для дальнейшего освещения многих аспектов модели программирования, которые я замалчивал в этом ответе.

1
задан gameon67 18 January 2019 в 07:19
поделиться