Я пытаюсь ускорить на GPU алгоритм, в котором я получаю асинхронный поток частиц в трехмерном пространстве $p=[x,y,t]$. Каждый вектор $p_n$ нужно умножить на набор матриц преобразования. Поскольку эти преобразования не зависят друг от друга, они могут происходить параллельно, поэтому для этого я написал ядро CUDA. Это работает хорошо, но, конечно, для каждого входящего $p_n$ я запускаю ядро CUDA заново. Запуск ядер CUDA влечет за собой большую потерю времени, и, таким образом, я теряю преимущество ускорения GPU. Итак, мой вопрос: могу ли я держать ядро открытым и каким-то образом передавать ему частицы?
Если это поможет, вот мое текущее ядро:
__global__
void project(float *projection_matrix, float *vector, float *output_matrix) {
int col_index = blockIdx.x * blockDim.x + threadIdx.x;
int row_index = blockIdx.y * blockDim.x + threadIdx.y;
int output_index = (col_index*3 + threadIdx.y);
int transform_first_element = col_index * 9 + threadIdx.y * 3;
int stride = blockDim.x*blockDim.y*gridDim.x;
while (output_index < (NUMBER_OF_TRANSFORMS * 3)) {
output_matrix[output_index] = projection_matrix[transform_first_element]*vector[0]+ projection_matrix[(transform_first_element+1)]*vector[1] + projection_matrix[(transform_first_element+2)]*vector[2];
output_index += stride;
}
}
и вот где я называю это:
...
project <<<num_blocks_dim, block_dim >>> (transformationList, inputVector, outputMatrix);
cudaDeviceSynchronize();
...