我试图用OpenMP实现矩阵乘法。
我发现通常在嵌套for循环中使用collapse指令。
所以我也用崩溃如下。 (此代码属于神经网络中的前馈)
for (i = 0; i < net->num_layer-1; i++) {
#pragma omp parallel for num_threads(thread) private(j) collapse(2)
for (j = 0; j < net->mini_batch_size; j++) {
for (k = 0; k < net->layer_size[i+1]; k++) {
#pragma omp simd reduction(+:sum)
for (l = 0; l < net->layer_size[i]; l++) {
sum = sum + NEURON(net, i, j, l) * WEIGHT(net, i, l, k);
}
ZS(net, i+1, j, k) = sum + BIAS(net, i+1, k);
NEURON(net, i+1, j, k) = sigmoid(ZS(net, i+1, j, k));
sum = 0.0;
}
}
}
但我想知道的是有没有办法实现并行化而不崩溃?我也尝试过如下,但表现符合我的期望。
omp_set_nested(1);
for (i = 0; i < net->num_layer-1; i++) {
#pragma omp parallel for num_threads(net->mini_batch_size) private(j)
for (j = 0; j < net->mini_batch_size; j++) {
#pragma omp parallel for num_threads(net->layer_size[i+1]) private(j, k)
for (k = 0; k < net->layer_size[i+1]; k++) {
#pragma omp simd reduction(+:sum)
for (l = 0; l < net->layer_size[i]; l++) {
sum = sum + NEURON(net, i, j, l) * WEIGHT(net, i, l, k);
}
ZS(net, i+1, j, k) = sum + BIAS(net, i+1, k);
NEURON(net, i+1, j, k) = sigmoid(ZS(net, i+1, j, k));
sum = 0.0;
}
}
}
在线程变量中是100常量。它会在稍后优化,但我现在修复它。而且,性能的结果是使用collpase,0.75sec,没有崩溃,25秒。
所以,无论如何,请告诉我是否有任何方法可以实现没有collpase的嵌套循环,从而获得比崩溃更好的性能。