以下のコードを実行すると、ループの 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_float
main
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;
}
ここで何がうまくいかないのか、そのメモリの問題を解決する方法を誰か教えてもらえますか?
アップデート
提供されたコードを変更しました。実際に問題が発生する部分だけを残しました。