Arrays 将索引中非幺正增量的嵌套循环移植到CUDA内核

Arrays 将索引中非幺正增量的嵌套循环移植到CUDA内核,arrays,loops,cuda,indexing,nested,Arrays,Loops,Cuda,Indexing,Nested,编辑:在解决方案中编辑并编写了一些代码来帮助尝试实现嵌套for循环的人 因此,我打算在cuda内核中实现以下嵌套for循环: for (unsigned in=1;in<=N;in++){ for (unsigned ie=1;ie<=N-1;ie+=2){ // do some stuff with x[in and/or ie] and z[in and/or ie] } for(无符号in=1;in代替: int ie = blo

编辑:在解决方案中编辑并编写了一些代码来帮助尝试实现嵌套for循环的人

因此,我打算在cuda内核中实现以下嵌套for循环:

for (unsigned in=1;in<=N;in++){         
     for (unsigned ie=1;ie<=N-1;ie+=2){
         // do some stuff with x[in and/or ie] and z[in and/or ie]
}
for(无符号in=1;in代替:

int ie = blockIdx.y * blockDim.y + (threadIdx.y + 1);
将此值设为2n+1:

int ie = (blockIdx.y * blockDim.y + threadIdx.y) * 2 + 1;

显然,你只需要N x N/2个线程。

但是我的内核是用ie=2、4、6、8执行的。这意味着我应该从0开始,然后乘以2,然后再加上1!抱歉-我错过了你正在使用基于1的索引的事实-现在修复了。谢谢@Paul,有时候这么简单的解决方案会被忽略,这很有趣:/我有多少不管我启动的内核是否比需要的多?当前执行的内核数量是否会影响性能?@Armen:您应该只启动实际需要的块。此外,如果N不能方便地分解,那么您还需要检查您的
ie
in
索引值是否超出范围,
int ie = (blockIdx.y * blockDim.y + threadIdx.y) * 2 + 1;