Zambiri za kuyezetsa koyipa

Tsiku lina ndidapeza mwangozi kachidindo kuti wogwiritsa ntchito amayesa kuyang'anira momwe RAM imagwirira ntchito pamakina ake enieni. Sindidzapereka code iyi (pali "nsalu ya mapazi" pamenepo) ndipo ndingosiya zofunikira kwambiri. Kotero, mphaka ali mu studio!

#include <sys/time.h>
#include <string.h>
#include <iostream>

#define CNT 1024
#define SIZE (1024*1024)

int main() {
	struct timeval start;
	struct timeval end;
	long millis;
	double gbs;
	char ** buffers;
	buffers = new char*[CNT];
	for (int i=0;i<CNT;i++) {
		buffers[i] = new char[SIZE];
	}
	gettimeofday(&start, NULL);
	for (int i=0;i<CNT;i++) {
		memset(buffers[i], 0, SIZE);
	}
	gettimeofday(&end, NULL);
	millis = (end.tv_sec - start.tv_sec) * 1000 +
		(end.tv_usec - start.tv_usec) / 1000;
	gbs = 1000.0 / millis;
	std::cout << gbs << " GB/sn";
	for (int i=0;i<CNT;i++) {
		delete buffers[i];
	}
	delete buffers;
	return 0;
}

Ndi zophweka - kugawa kukumbukira ndi kulemba gigabyte imodzi mmenemo. Ndipo mayesowa akuwonetsa chiyani?

$ ./memtest
4.06504 GB / s

Pafupifupi 4GB/s.

Chani?!?!

Bwanji?!?!?

Iyi ndi Core i7 (ngakhale si yatsopano kwambiri), DDR4, purosesa ili pafupi kudzaza - CHIFUKWA CHIYANI?!?!

Yankho, monga nthawi zonse, ndi wamba modabwitsa.

Wogwiritsa ntchito watsopano (monga ntchito ya malloc, mwa njira) samagawa kukumbukira. Ndi kuyitana uku, woperekayo amayang'ana mndandanda wa malo aulere mu dziwe la kukumbukira, ndipo ngati palibe, amayitana sbrk () kuti awonjezere gawo la deta, ndiyeno amabwerera ku pulogalamuyo kutchula adiresi kuchokera kumalo atsopano. kuperekedwa.

Vuto ndiloti malo omwe aperekedwawo ndi enieni. Palibe masamba enieni okumbukira omwe aperekedwa.

Ndipo pamene mwayi woyamba wa tsamba lirilonse kuchokera ku gawo lomwe laperekedwa likuchitika, MMU "ikuwombera" vuto la tsamba, pambuyo pake tsamba lomwe likupezeka likupatsidwa yeniyeni.

Chifukwa chake, kwenikweni, sitikuyesa magwiridwe antchito a mabasi ndi RAM, koma magwiridwe antchito a MMU ndi VMM. Ndipo kuti tiyese ntchito yeniyeni ya RAM, timangofunika kuyambitsa madera omwe aperekedwa kamodzi. Mwachitsanzo monga chonchi:

#include <sys/time.h>
#include <string.h>
#include <iostream>

#define CNT 1024
#define SIZE (1024*1024)

int main() {
	struct timeval start;
	struct timeval end;
	long millis;
	double gbs;
	char ** buffers;
	buffers = new char*[CNT];
	for (int i=0;i<CNT;i++) {
                // FIXED HERE!!!
		buffers[i] = new char[SIZE](); // Add brackets, &$# !!!
	}
	gettimeofday(&start, NULL);
	for (int i=0;i<CNT;i++) {
		memset(buffers[i], 0, SIZE);
	}
	gettimeofday(&end, NULL);
	millis = (end.tv_sec - start.tv_sec) * 1000 +
		(end.tv_usec - start.tv_usec) / 1000;
	gbs = 1000.0 / millis;
	std::cout << gbs << " GB/sn";
	for (int i=0;i<CNT;i++) {
		delete buffers[i];
	}
	delete buffers;
	return 0;
}

Ndiye kuti, timangoyambitsa ma buffer omwe adapatsidwa ndi mtengo wosasintha (char 0).

Kufufuza:

$ ./memtest
28.5714 GB / s

Chinthu china.

Makhalidwe a nkhaniyi - ngati mukufuna mabafa akulu kuti agwire ntchito mwachangu, osayiwala kuwayambitsa.

Source: www.habr.com

Kuwonjezera ndemanga