如何在C++类中正确使用 CUDA 中的块和线程

How to properly use blocks and threads in CUDA in C++ class

本文关键字:CUDA 线程 C++      更新时间:2023-10-16

我不知道这是否可能与 CUDA 一起使用(我是 CUDA 编程的新手)。我想要一个并行完成一些工作的内核(Test::work),但这项工作的某些部分也可以进一步并行化(stuff_that_can_be_done_in_parallel)。

在下面的示例(伪代码)中,启动内核kernel<<<NBLOCKS,1>>>(d_test)它按预期工作,但我找不到通过执行以下操作来进一步并行化的方法:kernel<<<NBLOCKS,16>>>(d_test)处理块内有 16 个线程的shared_data,每个项目 1 个线程。

class Test {
public:
__host__ void set_data(int[] d) { ... }
__host__ __device__ void work() {
while (condition) {
... do some stuff sequentially, calculating x
for (int i=0; i<16; i++) {
stuff_that_can_be_done_in_parallel(i, x);
}
[synchronize]
and update m_data with the values of shared_data
}
}
__host__ __device__ void stuff_that_can_be_done_in_parallel(int i, int x) {
... calculate shared_data
}
int m_data[NELEMENTS];
int shared_data[16]; // how to properly declare this as __shared__ ? 
};
__global__ void kernel(Test* t)
{
t[blockIdx.x].work();
}

int main() 
{
Test *h_test[NBLOCKS], *d_test;
h_test = new Test[NBLOCKS]
for (int i=0; i<NBLOCKS; i++) h_test[i].set_data(...);
cudaMalloc((void**)&d_test, NBLOCKS*sizeof(Test));
cudaMemcpy(d_test, h_test, NBLOCKS*sizeof(Test), cudaMemcpyHostToDevice);   
kernel<<<NBLOCKS,1>>>(d_test);
cudaDeviceSynchronize();
cudaMemcpy(h_test, d_test, NBLOCKS*sizeof(Test), cudaMemcpyDeviceToHost);   
cudaFree(d_test);
delete[] h_test;
return 0;
}

我找到了我要找的东西。它是一个称为"CUDA 动态并行性"的 CUDA 扩展。谢谢大家的时间,很抱歉这个问题不清楚。正如我所说,我对 CUDA 编程非常陌生,当时我不知道我真正在寻找什么。