最近我正在研究CUDA。我想了解CUDA内存访问时间。
In,CUDA Programming Guide编写的内存访问时间:
我认为Cycle和clock一样。它是否正确 ?如果那是正确的,那么我检查了内存访问时间。主机是固定的,但内核代码有3个版本。这是我的代码:
主持人代码
float* H1 = (float*)malloc(sizeof(float)*100000);
float* D1;
for( int i = 0 ; i < 100000 ; i++ ){
H1[i] = i;
}
cudaMalloc( (void**)&D1, sizeof(float)*100000);
cudaMemcpy( D1, H1, sizeof(float)*100000, cudaMemcpyHostToDevice );
cudaPrintfInit();
test<<<1,1>>>( D1 );
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();
内核版本1
float Global1;
float Global2;
float Global3;
int Clock;
Clock = clock();
Global1 = Dev_In1[1];
Clock = clock() - Clock;
cuPrintf("Global Memory Access #1 : %d\n", Clock );
Clock = clock();
Global2 = Dev_In1[2];
Clock = clock() - Clock;
cuPrintf("Global Memory Access #2 : %d\n", Clock );
Clock = clock();
Global3 = Dev_In1[3];
Clock = clock() - Clock;
cuPrintf("Global Memory Access #3 : %d\n", Clock );
结果
全球记忆存取#1:882
全局内存访问#2:312
全局内存访问#3:312
我认为第一次访问不是缓存所以需要800周期 但第二次访问第3次访问需要312周期,因为,Dev_In [2],Dev_In [3]被缓存..
内核版本2
int Global1, Global2, Global3;
int Clock;
Clock = clock();
Global1 = Dev_In1[1];
Clock = clock() - Clock;
cuPrintf("Global Memory Access #1 : %d\n", Clock );
Clock = clock();
Global2 = Dev_In1[50000];
Clock = clock() - Clock;
cuPrintf("Global Memory Access #2 : %d\n", Clock );
Clock = clock();
Global3 = Dev_In1[99999];
Clock = clock() - Clock;
cuPrintf("Global Memory Access #3 : %d\n", Clock );
它的结果
全球内存访问#1:872
全局内存访问#2:776
全局内存访问#3:782
我认为在第一次访问时没有缓存Dev_In1 [50000]和Dev_In2 [99999]
所以......#1,#2,#3迟到了......
内核版本3
int Global1, Global2, Global3;
int Clock;
Clock = clock();
Global1 = Dev_In1[1];
Clock = clock() - Clock;
cuPrintf("Global Memory Access #1 : %d\n", Clock );
Clock = clock();
Global1 = Dev_In1[50000];
Clock = clock() - Clock;
cuPrintf("Global Memory Access #2 : %d\n", Clock );
Clock = clock();
Global1 = Dev_In1[99999];
Clock = clock() - Clock;
cuPrintf("Global Memory Access #3 : %d\n", Clock );
结果
全球内存访问#1:168
全局内存访问#2:168
全局内存访问#3:168
我不明白这个结果
Dev_In [50000],Dev_In [99999]未缓存,但访问时间非常快!! 只是,我使用了1个变量......
SO ..我的问题是gpu cycle == gpu clock?
和在result1,result2,result3为什么在result3中内存访问时间非常快?
答案 0 :(得分:1)
由于@phoad所述的原因,您的评估无效。在存储器访问之后和时钟停止之前,您应该重用存储器读取值以使指令依赖于未完成的负载。否则,GPU会一个接一个地发出独立的指令,并且在时钟启动和加载之后立即执行时钟结束。我建议你试试Henry Wong在here准备的微型基准套装。使用此套装,您可以检索各种微体系结构细节,包括内存访问延迟。如果您只需要内存延迟,则可以更轻松地尝试由Sylvain Collange开发的CUDA latency。