OpenMP嵌套for循环而没有折叠指令

时间:2016-11-02 12:00:32

标签: c openmp collapse

我试图用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的嵌套循环,从而获得比崩溃更好的性能。

0 个答案:

没有答案