我不知道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;
}
答案 0 :(得分:0)
我找到了想要的东西。它是一个称为“ CUDA动态并行性”的CUDA扩展。谢谢大家的时间,对于不清楚的问题,我们深表歉意。正如我所说,我对CUDA编程非常陌生,当时我还不知道自己真正在寻找什么。