我想請問性能兩個問題。我一直無法創建簡單的代碼來說明。CUDA性能:分支和共享內存
問題1:如何昂貴的非發散分支?在我的代碼中,似乎它甚至超過了4個非fma FLOPS的等價值。請注意,我正在談論BRA PTX代碼,其謂詞已經被計算出來
問題2:我一直在閱讀大量關於共享內存的性能和一些文章,如a Dr Dobbs article甚至說它可以像寄存器一樣快只要訪問得好)。在我的代碼中,塊內warps內的所有線程訪問相同的共享變量。我相信在這種情況下共享內存是以廣播方式訪問的,不是嗎?它是否應以這種方式達到寄存器的性能?是否有任何特殊的事情需要考慮使其發揮作用?
編輯:我已經能夠建造一些簡單的代碼,讓更多的有識之士爲我的查詢
這
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <float.h>
#include "cuComplex.h"
#include "time.h"
#include "cuda_runtime.h"
#include <iostream>
using namespace std;
__global__ void test()
{
__shared__ int t[1024];
int v=t[0];
bool b=(v==-1);
bool c=(v==-2);
int myValue=0;
for (int i=0;i<800;i++)
{
#if 1
v=i;
#else
v=t[i];
#endif
#if 0
if (b) {
printf("abs");
}
#endif
if (c)
{
printf ("IT HAPPENED");
v=8;
}
myValue+=v;
}
if (myValue==1000)
printf ("IT HAPPENED");
}
int main(int argc, char *argv[])
{
cudaEvent_t event_start,event_stop;
float timestamp;
float4 *data;
// Initialise
cudaDeviceReset();
cudaSetDevice(0);
dim3 threadsPerBlock;
dim3 blocks;
threadsPerBlock.x=32;
threadsPerBlock.y=32;
threadsPerBlock.z=1;
blocks.x=1;
blocks.y=1000;
blocks.z=1;
cudaEventCreate(&event_start);
cudaEventCreate(&event_stop);
cudaEventRecord(event_start, 0);
test<<<blocks,threadsPerBlock,0>>>();
cudaEventRecord(event_stop, 0);
cudaEventSynchronize(event_stop);
cudaEventElapsedTime(×tamp, event_start, event_stop);
printf("Calculated in %f", timestamp);
}
我運行在GTX680這個代碼。
現在結果如下..
如果運行,因爲它是它需要5.44毫秒
如果更改所述第一條件的#if 0(這將使從共享存儲器讀出),它會採取6.02ms ..沒有更多的,但對我來說還是
如果我能第二#如果條件(插入一個分支,永遠不會評估爲真)它9.647040ms運行不夠。性能下降非常大。原因是什麼?可以做些什麼?
我也改變了略微的代碼,以使進一步檢查具有共享存儲器
代替
__shared__ int t[1024]
我確實
__shared__ int2 t[1024]
何予訪問T []我剛訪問噸[]。X。在性能進一步下降到10毫秒..(另一個400微秒)爲什麼會發生這種情況?
問候 丹尼爾
絕對很混亂我會說。我試圖製作一些很好的簡單代碼來說明問題..會回來一次希望成功 – Daniel
剛剛發佈了一些代碼 – Daniel