ฉันกำลังพยายาม GPU เร่งอัลกอริธึมโดยที่ฉันได้รับกระแสอนุภาคแบบอะซิงโครนัสในพื้นที่ 3 มิติ $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();
...