Изменения

Перейти к: навигация, поиск

Многопоточность в машинном обучении

2106 байт добавлено, 04:38, 9 января 2021
Подсветка кода
Пример перемножения матриц на cuBLAS
<font color="#B00040">void </font> <font color="#0000FF">gpu_blas_mmul</font>(cublasHandle_t &handle, <font color="#008000">'''const '''</font> <font color="#B00040">float </font> *A, <font color="#008000">'''const '''</font> <font color="#B00040">float </font> *B, <font color="#B00040">float </font> *C, <font color="#008000">'''const '''</font> <font color="#B00040">int </font> m, <font color="#008000">'''const '''</font> <font color="#B00040">int </font> k, <font color="#008000">'''const '''</font> <font color="#B00040">int </font> n) { <font color="#B00040">int </font> lda = m, ldb = k, ldc = m; <font color="#008000">'''const '''</font> <font color="#B00040">float </font> alf = 1; <font color="#008000">'''const '''</font> <font color="#B00040">float </font> bet = 0; <font color="#008000">'''const '''</font> <font color="#B00040">float </font> *alpha = &alf; <font color="#008000">'''const '''</font> <font color="#B00040">float </font> *beta = &bet; <font color="#408080">''// Do the actual multiplication''</font>
cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc);
}
Пример перемножения матриц на PyCUDA
<font color="#008000">'''import '''</font> <font color="#0000FF">'''pycuda.gpuarray '''</font> <font color="#008000">'''as '''</font> <font color="#0000FF">'''gpuarray'''</font> <font color="#008000">'''import '''</font> <font color="#0000FF">'''numpy '''</font> <font color="#008000">'''as '''</font> <font color="#0000FF">'''np'''</font> <font color="#008000">'''import '''</font> <font color="#0000FF">'''skcuda.linalg '''</font> <font color="#008000">'''as '''</font> <font color="#0000FF">'''linalg'''</font> <font color="#408080">''# --- Initializations''</font> <font color="#008000">'''import '''</font> <font color="#0000FF">'''pycuda.autoinit'''</font>
linalg.init()
C_gpu = linalg.dot(A_gpu, B_gpu)
<font color="#008000">print</font>(np.dot(A, B)) <font color="#008000">print</font>(C_gpu)
Наивная реализация перемножения матриц на OpenCL
<font color="#408080">''// First naive implementation''</font> __kernel <font color="#B00040">void </font> myGEMM1(<font color="#008000">'''const '''</font> <font color="#B00040">int </font> M, <font color="#008000">'''const '''</font> <font color="#B00040">int </font> N, <font color="#008000">'''const '''</font> <font color="#B00040">int </font> K, <font color="#008000">'''const '''</font> __global <font color="#B00040">float </font> *A, <font color="#008000">'''const '''</font> __global <font color="#B00040">float </font> *B, __global <font color="#B00040">float </font> *C) {
<font color="#408080">''// Thread identifiers''</font> <font color="#008000">'''const '''</font> <font color="#B00040">int </font> globalRow = get_global_id(0); <font color="#408080">''// Row ID of C (0..M)''</font> <font color="#008000">'''const '''</font> <font color="#B00040">int </font> globalCol = get_global_id(1); <font color="#408080">''// Col ID of C (0..N)''</font>
<font color="#408080">''// Compute a single element (loop over K)''</font> <font color="#B00040">float </font> acc = 0.0f; <font color="#008000">'''for '''</font> (<font color="#B00040">int </font> k = 0; k < K; k++) {
acc += A[k * M + globalRow] * B[globalCol * K + k];
}
<font color="#408080">''// Store the result''</font>
C[globalCol * M + globalRow] = acc;
}
10
правок

Навигация