diff options
author | Qi Liu <[email protected]> | 2016-03-15 13:17:45 +0800 |
---|---|---|
committer | Qi Liu <[email protected]> | 2016-03-15 13:17:45 +0800 |
commit | b547dd2a30e91ce124d50f763997070ea67c6f7e (patch) | |
tree | e6f77044f68fd14b3c58b8bcda5ce84d84e96f62 /nerv/lib/matrix/generic/cukernel.cu | |
parent | 3dd235c8b6ea7ef275381866d11d1be828d27a06 (diff) |
add mask on softmax_ce
Diffstat (limited to 'nerv/lib/matrix/generic/cukernel.cu')
-rw-r--r-- | nerv/lib/matrix/generic/cukernel.cu | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/nerv/lib/matrix/generic/cukernel.cu b/nerv/lib/matrix/generic/cukernel.cu index 93121dc..4717209 100644 --- a/nerv/lib/matrix/generic/cukernel.cu +++ b/nerv/lib/matrix/generic/cukernel.cu @@ -324,6 +324,15 @@ __global__ void cudak_(rearrange_frm)(const MATRIX_ELEM *a, MATRIX_ELEM *b, b[j + i * stride] = a[j / step + (j % step) * orig_dim + i * stride]; } +__global__ void cudak_(set_values_by_mask)(const MATRIX_ELEM *a, MATRIX_ELEM *b, + int nrow, int ncol, + int astride, int bstride, double val) { + int j = blockIdx.x * blockDim.x + threadIdx.x; + int i = blockIdx.y * blockDim.y + threadIdx.y; + if (i >= nrow || j >= ncol || a[i * astride] != 0.0) return; + b[j + i * bstride] = val; +} + __global__ void cudak_(scale_rows_by_col)(const MATRIX_ELEM *a, MATRIX_ELEM *b, int nrow, int ncol, int astride, int bstride) { @@ -766,6 +775,19 @@ extern "C" { cudaStreamSynchronize(0); } + void cudak_(cuda_set_values_by_mask)(const Matrix *a, Matrix *b, double val) { + dim3 threadsPerBlock(CUDA_THREADS_N, CUDA_THREADS_N); + dim3 numBlocks(CEIL_DIV(b->ncol, threadsPerBlock.x), + CEIL_DIV(b->nrow, threadsPerBlock.y)); + cudak_(set_values_by_mask)<<<numBlocks, threadsPerBlock>>> \ + (MATRIX_ELEM_PTR(a), MATRIX_ELEM_PTR(b), + b->nrow, b->ncol, + a->stride / sizeof(MATRIX_ELEM), + b->stride / sizeof(MATRIX_ELEM), + val); + cudaStreamSynchronize(0); + } + void cudak_(cuda_scale_rows_by_row)(const Matrix *a, Matrix *b) { dim3 threadsPerBlock(CUDA_THREADS_N, CUDA_THREADS_N); dim3 numBlocks(CEIL_DIV(b->ncol, threadsPerBlock.x), |