0

JAVA私のプロジェクトでは、通常、巨大な配列をスカラーで乗算する必要があります。したがって、いわゆる を使用してメソッドを作成することを考えていましたloop unrolling。これまでのところ、私はこれを思いつきました:

public static float[] arrayTimesScalar(float[] array, float scalar){
int n = array.length;
float[] result = new float[n];
int m = n % 7;
if(n == 0){ throw new Error("The input array must,at least, hold one element"); }

if (n < 7){
    for(int i = 0; i < 7; i++){
        result[i] = scalar*array[i];
    } // end for
}
else{
    if (m != 0){
        for(int i = 0; i < m; i++){
            result[i] = scalar*array[i];
        }
        for(int i = m; i < n; i += 7){
            result[i] = scalar*array[i];
            result[i + 1] = scalar*array[i + 1];
            result[i + 2] = scalar*array[i + 2];
            result[i + 3] = scalar*array[i + 3];
            result[i + 4] = scalar*array[i + 4];
            result[i + 5] = scalar*array[i + 5];
            result[i + 6] = scalar*array[i + 6];
        }
    }
    else{
        for(int i = 0; i < n; i += 7){
            result[i] = scalar*array[i];
            result[i + 1] = scalar*array[i + 1];
            result[i + 2] = scalar*array[i + 2];
            result[i + 3] = scalar*array[i + 3];
            result[i + 4] = scalar*array[i + 4];
            result[i + 5] = scalar*array[i + 5];
            result[i + 6] = scalar*array[i + 6];
        }
    }
}       
return result;

}

高度に最適化されたコンパイラではありますが、現在表示されているメソッドが正しいかどうか、およびループ展開を使用してまだ意味があるかどうかを理解していただければ幸いです。

4

2 に答える 2

2

ループ展開は非常に低レベルの最適化であるため、最新の JVM ではおそらく意味がありません。ただし、他人に推測したり質問したりしないでください。コードをターゲット システムでテストし、パフォーマンスを測定する必要があります。

正確性については、たとえば単体テストを作成することで、これも非常に簡単に検証できると思います。コードに明らかに問題はありません。

于 2013-07-03T08:02:17.260 に答える
0

n の大きさと時間の制約がどれほど難しいかに応じて、乗算を安全に並列化することができます。もちろん、それは大きな変更ですが、パフォーマンスを向上させるには、このような高レベルの変更が唯一のオプションだと思います。

ループの展開などの「些細な」ことは、実行時にコンパイラと JIT によって行われます。

于 2013-07-03T08:21:30.090 に答える