我想将以前的c ++代码转换为CUDA
for(int x=0 ; x < 100; x++)
{
for(int y=0 ; y < 100; y++)
{
for(int w=0 ; w < 100; w++)
{
for(int z=0 ; z < 100; z++)
{
........
}
}
}
}
这些循环组合起来创建一个新的int值。
如果我想使用CUDA,我必须在构建之前设计线程层次结构 内核代码。
那么如何设计层次结构呢?
取决于每个循环,我认为它会是这样的:
100 * 100 * 100 * 100 = 100000000个线程。
你能帮助我吗
由于
我的CUDA规范:
CUDA设备#0
主要修订号:1
次要修订号:1
名称:GeForce G 105M
全球总记忆:536870912
每个块的共享内存总量:16384
每块总寄存器数:8192
翘曲尺寸:32
最大内存间距:2147483647
每个块的最大线程数:512
块的最大尺寸1:512
块的最大尺寸2:512
块的最大尺寸3:64
网格的最大尺寸1:65535
网格的最大尺寸2:65535
网格的最大尺寸3:1
时钟频率:1600000
总常数内存:65536
纹理对齐:256
并发复制和执行:否
多处理器数量:1
内核执行超时:是
答案 0 :(得分:1)
GPU的100000000个线程(或块)并不算太多。
您的GPU具有1.1的计算能力,因此在前两个网格维度(x和y)的每一个中限制为65535个块。由于100 * 100 = 10000,我们可以在前两个网格维度中的每一个中启动10000个块,以覆盖整个for循环范围。这将为每个for循环迭代启动一个块(x
,y
,z
和w
的唯一组合)并假设您将使用块中的线程满足您的for循环计算代码的需求:
__global__ void mykernel(...){
int idx = blockIdx.x;
int idy = blockIdx.y;
int w = idx/100;
int z = idx%100;
int x = idy/100;
int y = idy%100;
int tx = threadIdx.x;
// (the body of your for-loop code here...
}
发射:
dim3 blocks(10000, 10000);
dim3 threads(...); // can use any number here up to 512 for your device
mykernel<<<blocks, threads>>>(...);
相反,如果您希望为for循环的每个内部z
迭代分配一个线程(可能有用/更高性能,具体取决于您正在执行的操作和数据组织),您可以执行某些操作像这样:
__global__ void mykernel(...){
int idx = blockIdx.x;
int idy = blockIdx.y;
int w = idx/100;
int x = idx%100;
int y = idy;
int z = threadIdx.x;
// (the body of your for-loop code here...
}
发射:
dim3 blocks(10000, 100);
dim3 threads(100);
mykernel<<<blocks, threads>>>(...);
以上所有假设您的for循环迭代都是独立的。如果你的for循环迭代相互依赖(取决于执行的顺序),那么这些简单的答案将不起作用,并且你没有在你的问题中提供足够的信息来讨论合理的策略。