我想把我以前在c++中的代码转换成数据自动化系统
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设备#0 主要修订编号:1 次要修订编号:1 名称: GeForce G 105 M 总全局内存: 536870912 每个块的总共享内存: 16384 每个区块的寄存器总数: 8192 经纱尺寸: 32 最大内存间距: 2147483647 每个块的最大线程数: 512 块的最大维数1: 512 块的最大维数2: 512 块的最大维数3: 64 网格的最大维数1: 65535 网格的最大维数2: 65535 网格的最大维数3:1 时钟率: 1600000 总常量内存: 65536 纹理对齐: 256 并发复制和执行:否 多处理器数:1 内核执行超时:是的
发布于 2015-04-22 13:33:49
对于GPU来说,100000000个线程(或块)并不多。
您的GPU具有计算能力1.1,因此它仅限于前两个网格维度(x和y)中的每个块65535个。由于100*100 = 10000,我们可以在前两个网格维度中启动10000个块,以覆盖整个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-循环迭代是相互依赖的(取决于执行顺序),那么这些简单的答案将不起作用,而且您在问题中没有提供足够的信息来讨论合理的策略。
https://stackoverflow.com/questions/29797675
复制相似问题