这就是我尝试过的。很难找到更好的索引...这种嵌套的for循环有些难以解决。
int k=0;
for (int m=0; m<7; i++) // outer loop
{
for(int j=0; j<100; j++) // inner loop 1
{a[k] = b[m] + c[j];
k++;
}
for(int j=0; j<100; j++) // inner loop 2
{a[k] = b[m] - c[j];
k++;
}
}
答案 0 :(得分:3)
对于您的示例代码,循环迭代似乎是独立的,这使事情变得更容易。
我们可以从计算迭代总数开始:8 *(100 + 100)= 1600。
因此,如果我们要完全分配工作,我们将希望启动至少1600个线程的网格。
您的m
变量似乎与循环无关,因此b[m]
实际上是您显示的代码的常数。
另一个计划是根据j
确定k
的索引,但这也很容易,它只是k%100
。
最终的计划项目是考虑循环迭代中c
上符号的变化。我们可以使用k/100
帮助我们确定这一点。
因此,我们将创建一个全局唯一的线程索引变量,并将其用作我们的k
变量:
__global__ void my_kernel(T1 *a, T2 *b, T3 *c, int N){
int k = threadIdx.x+blockDim.x*blockIdx.x;
int m = <some value>;
int j = k%100;
if (k < N)
a[k] = b[m] + ((k/100)&1)?(-c[j]):c[j];
}
确保使用至少1600个线程(在一维网格中)启动它,并为N
传递1600个线程。
对于与T1
,T2
,T3
对应的任何类型,a
,b
,c
可以是typedef。
请注意,在您的代码中您有以下内容:
for(int j=0; j<100; j+=)
^
This doesn't make sense to me.
所以我只是假装是这样的:
for(int j=0; j<100; j++)
具有这样的修改(与在问题中进行的修改不同):
for (int m=0; m<7; m++) // outer loop
^
唯一的变化是m
变量的计算:
__global__ void my_kernel(T1 *a, T2 *b, T3 *c, int N){
int k = threadIdx.x+blockDim.x*blockIdx.x;
int m = k/200; // change this line
int j = k%100;
if (k < N)
a[k] = b[m] + ((k/100)&1)?(-c[j]):c[j];
}