Я модифицирую код Dar knet для дополнительной реализации. Итак, я добавил много динамических c кодов выделения памяти в исходный код. Но я обнаружил много утечек памяти. Итак, я использовал Valgrind для проверки их.
Но, есть неизвестное сообщение об ошибке от Valgrind.
==29993== Invalid write of size 8
==29993== at 0x184550: gemm_nt (gemm.c:95)
==29993== by 0x184B03: gemm_cpu (gemm.c:164)
==29993== by 0x1843EF: gemm (gemm.c:71)
==29993== by 0x1690B7: forward_connected_layer (connected_layer.c:180)
==29993== by 0x16654B: forward_network (network.c:614)
==29993== by 0x16766B: network_predict (network.c:957)
==29993== by 0x11C6AB: validate_classifier_single (classifier.c:619)
==29993== by 0x11E9C3: run_classifier (classifier.c:1371)
==29993== by 0x12BCF3: main (darknet.c:449)
==29993== Address 0x1ffeffea00 is on thread 1's stack
==29993== 80 bytes below stack pointer
==29993==
Строка ошибки просто указывает на "{", которая начинает строку функции "gemm_nt". Но я не знаю, почему она указывает на эту строку.
void gemm_nt(int M, int N, int K, float ALPHA, float *A, int lda, float *B, int ldb, float *C, int ldc)
{ // <- error line pointed by Valgrind (line:95)
int i,j,k;
#pragma omp parallel for
for(i = 0; i < M; ++i){
for(j = 0; j < N; ++j){
register float sum = 0;
for(k = 0; k < K; ++k){
sum += ALPHA*A[i*lda + k]*B[j*ldb + k];
}
C[i*ldc + j] += sum;
}
}
}
Кроме того, я уже проверил "ошибку из-за границы". Как я проверяю, они не выходят за пределы массива.