我正在尝试使用在GPU上运行的OpenCL来并行化这样的代码:
int pos = 0;
for (int x=0 ; x<x_len ; x++){
//do some expensive calculation like
int value = pow(24, x);
for (int y=0 ; y<y_len ; y++){
for (int z=0 ; z<z_len ; z++){
//do some expensive calculation that depends on value
//but is very unlikely to have a positive result needed
//to save in global memmoy - something like
if ((value * y * z) % 456 = 0){
// save position that had positive result
output[pos] = x*y_len*z_len+y*z_len + z;
pos++;
}
}
}
}
(y_len
和z_len
足够小,以便(1,y_len
,z_len
)lokal工作组成为可能,以防万一重要)
我当前的解决方案有2个内核,一个计算外部计算并将结果保存到全局内存,第二个使用该计算数据并计算内部计算(使用atomic_add
表示pos)。这工作正常但我的实际代码需要保存更多数据而不是每x次迭代只有一个整数(实际上是2个整数和2个长整数),因此全局内存用得非常快。这意味着我需要拆分内核调用并多次迭代主机代码中的调用。
所以我的问题是,如果有更好的方法来并行化该代码?