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

时间:2019-06-28 18:32:33

标签: c++ cuda

我不知道CUDA是否可以实现(我是CUDA编程的新手)。我希望有一个可以并行执行某些工作的内核(Test::work),但是这项工作的某些部分也可以进一步并行化(stuff_that_can_be_done_in_parallel)。

在下面的示例波纹管(伪代码)中,使用kernel<<<NBLOCKS,1>>>(d_test)启动内核可以按预期工作,但是我找不到通过执行以下操作来进一步并行化的方法:kernel<<<NBLOCKS,16>>>(d_test)处理shared_data块中有16个线程,每个项目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;
}

1 个答案:

答案 0 :(得分:0)

我找到了想要的东西。它是一个称为“ CUDA动态并行性”的CUDA扩展。谢谢大家的时间,对于不清楚的问题,我们深表歉意。正如我所说,我对CUDA编程非常陌生,当时我还不知道自己真正在寻找什么。