如何在C++类中正确使用 CUDA 中的块和线程
How to properly use blocks and threads in CUDA in C++ class
我不知道这是否可能与 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 编程非常陌生,当时我不知道我真正在寻找什么。
相关文章:
- 在cuda线程之间共享大量常量数据
- cuda:多个线程访问同一个全局变量
- cv::cuda::Stream选择线程默认流
- 为什么 cuda-gdb 会启动多个线程?
- 是否可以在多线程而不是 cuda/opencl C++运行 GPU?
- 多个线程访问同一个 cuda 流
- CUDA:来自不同翘曲但相同块的 2 个线程尝试写入相同的共享内存位置:危险?
- 如何在C++类中正确使用 CUDA 中的块和线程
- 如何在 CUDA 中的块中返回其他线程
- CUDA 将大于线程计数的数组复制到共享内存
- CUDA内核无缘无故地使用20K 线程崩溃
- CUDA中图像行 /列的线程索引
- 只有一个线程执行 CUDA 内核
- 当运行的线程数超过内核数时,CUDA性能会得到提高
- 在Cuda中启动2d线程块时崩溃
- CUDA 线程在全局内存中的私有位置写入时出现错误结果
- 填充计数'buckets' CUDA 线程
- 可能是CUDA线程块中的负索引
- 决定用于图像处理的CUDA线程和块
- 如何在CUDA线程内计算矩阵的指数