【发布时间】:2018-09-30 13:30:37
【问题描述】:
问题
我有兴趣使用CUDA 并行化问题。有问题的C 代码遵循以下简化形式:
int A, B, C; // 100 < A,B,C,D < 1,000
float* v1, v2, v3;
//v1,v2, v3 will have respective size A,B,C
//and will not be empty
float*** t1, t2, t3;
//t1,t2,t3 will eventually have the size (ci,cj,ck)
//and will not be empty
int i, j , k, l;
float xi, xj, xk;
for (i=0; i<A; ++i){
xi = ci - v1[i];
for (j=0; j<B; ++j){
xj = (j*cj)*cos(j*M_PI/180);
for (k=0;k<C; ++k){
xk = xj - v3[k];
if (xk < xi){
call_1(t1[i], v1, t2[i], &t3[i][j][k]);
}
else t3[i][j][k] = some_number;
}
}
}
这里是call_1
void call_1 (float **w, float *x, float **y, float *z){
int k, max = some_value;
float *v; //initialize to have size max
for (k=0; k<max; ++k)
call_2(x[k], y[k], max, &v[k]);
call_2(y, v, max, z);
}
这里call_2是
void call_2 (float *w, float*x, int y, double *z)
在单个while 循环中仅包含位移、乘法、减法和加法等操作。
尝试的想法
到目前为止,我的想法是,函数call_1可以转化为内核代码__global__ void call_1;并且call_2 可以在不修改其内容的情况下转换为设备代码。特别是,我大概可以让__global__ void call_1 成为
double* v; //initialize to have size max
int index = blockIdx.x * blockDim.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
for (int k=index; k<max; k += stride)
call_2 (x[k], y[k], max, &v[k]);
__syncthreads();
call_2 (y, v, max, z);
free (v);
我部分知道可以通过使用threadIdx, blockIdx, and gridDim 的组合来删除 for 循环,但我特别不确定如何特别是问题包含一个也使用函数调用的函数调用。
【问题讨论】:
标签: loops for-loop parallel-processing cuda