1

以下のコードを実行すると、ループの 2 回目の反復で OS 全体がハングします。タスク マネージャーを開くと、大量のメモリ リークが発生していることがわかります。コードの実行を開始した後、すべてのメモリが 4 秒でなくなりました。

コードは次のとおりです。

void matrix_vector_multiplication_comparison()
{    
    for (unsigned DIMS_SIZE = 64; DIMS_SIZE <= 2048; DIMS_SIZE += 64)
    {

        __declspec(align(16))float* m1 = generate_random_1d_matrix(DIMS_SIZE * DIMS_SIZE);
        __declspec(align(16))float* m2 = generate_random_1d_matrix(DIMS_SIZE * DIMS_SIZE);
        __declspec(align(16))float* v1 = generate_random_1d_matrix(DIMS_SIZE);
        __declspec(align(32))float* v2 = generate_random_1d_matrix(DIMS_SIZE);
        __declspec(align(16))float* res1 = new float[DIMS_SIZE];
        __declspec(align(16))float* res2 = new float[DIMS_SIZE];
        __declspec(align(32))float* res3 = new float[DIMS_SIZE];


// ........ other stuff here...........

        delete[] m1;
        delete[] m2;
        delete[] v1;
        delete[] v2;
        delete[] res1;
        delete[] res2;
        delete[] res3;
    }
} 

コード内のすべてをコメント アウトし、__declspec(align())宣言とのみをループdelete[]内に残すとfor、メモリ リークは依然として存在し、問題が実際にはこれら__declspecの s にあることが示されます。

関数とは次のようgenerate_random_1d_matrixになります。get_random_floatmain

float* generate_random_1d_matrix(unsigned const int dims)
{
    size_t i;
    float* result = new float[dims * dims];
    for (i = 0; i < dims * dims; ++i)
        result[i] = get_random_float(10, 100);
    return result;
}

inline float get_random_float(float min, float max)
{
    float f = (float)rand() / RAND_MAX;
    return min + f * (max - min);
}

int main()
{
    matrix_vector_multiplication_comparison();
    return 0;
}

ここで何がうまくいかないのか、そのメモリの問題を解決する方法を誰か教えてもらえますか?

アップデート

提供されたコードを変更しました。実際に問題が発生する部分だけを残しました。

4

2 に答える 2

4
delete[] m1, m2, v1, v2, res1, res2, res3;

これは、あなたが思っていることをしません。コンマ演算子を使用していますが、おそらく複数のものを に渡すつもりでしたdelete[]。すべての変数を独自に削除する必要があります。

delete[] m1;
delete[] m2;
delete[] v1;
delete[] v2;
delete[] res1;
delete[] res2;
delete[] res3;
于 2015-11-21T20:35:23.863 に答える
2

2048 をより適切な数値に下げてみてください。そのままでは、何百万ものフロートを大きなブロックに割り当てようとしていますが、これは合理的ではないようです。(実際は数千万かもしれません)

わずか 128 であっても、2 億を超える 128^4*2 の float を割り当てようとしています。前回の説明で少し低めでした。64 でさえ、おそらく高すぎます。

問題は、generate_random_1d_matrix で dims*dims を使用する場合は、単に dims を使用する必要があることです。結局のところ、その1Dマトリックスです。

于 2015-11-21T21:17:24.917 に答える