0

Kepler デバイスでカーネルの実行をオーバーラップさせようとしていますが、NVVP レイアウトからはオーバーラップしていないようです。ここにコードがあります、

#include<stdio.h>
#include<sys/time.h>
#include<time.h>


#define NY 1024
#define NX 1024
__global__ void kernel1(int j,int *A,int *b)  
{  
int i = blockIdx.x * blockDim.x + threadIdx.x;  
b[j*NY+i] = A[i*NY+j];  

}  

__global__ void kernel2(int j,int *A,int *b)  
 {  
 int i = blockIdx.x * blockDim.x + threadIdx.x;  
 for(int time=0;time<100;time++)  
 b[j*NY+i] += 10;  
 }  


 int main()  
 {  
 int nstreams=4;
 int *a, *b;
 struct timeval t1,t2;

cudaMalloc((void**)&a,NX*NY*sizeof(int));
cudaMalloc((void**)&b,NX*NY*sizeof(int));


 cudaStream_t *streams = (cudaStream_t *) malloc(nstreams * sizeof(cudaStream_t));
 for (int i = 0; i < nstreams; i++)
 { 
 cudaStreamCreate(&(streams[i]));
 }

 gettimeofday(&t1, NULL);

 for(int newvar=0;newvar<NX;newvar++)
 {
  kernel1<<<1,NY,0,streams[newvar%nstreams]>>>(newvar,a,b);
 }
 for(int newvar=0;newvar<NX;newvar++)
 {
   kernel2<<<1,NY,0,streams[newvar%nstreams]>>>(newvar,a,b);
 }  
 cudaDeviceSynchronize();  
 gettimeofday(&t2, NULL);

 return 0;

 }

いくつかのヒントを提案してください。CUDA バージョン 5.5 NVVP バージョン 5.5 Linux マシン Ubuntu 12.10

ここに画像の説明を入力

4

1 に答える 1

1

基本的に問題は、カーネルが十分に長く実行されていないことだと思います。カーネルの実行時間は数マイクロ秒であり、カーネルの起動オーバーヘッドも数マイクロ秒であるため、重複は見られません。API が新しいカーネル起動のセットアップを完了するまでに、以前のカーネルは完了しています。

私はあなたを次のように修正kernel1しました:

__global__ void kernel1(int j,int *A,int *b)  
{  
  int i = blockIdx.x * blockDim.x + threadIdx.x;  
  for (int q = 0; q < 1000; q++)
    b[j*NY+i] = A[i*NY+j] + q/j;  
} 

これらの変更について魔法や特別なことは何もありません。カーネルの実行時間を (数マイクロ秒から数ミリ秒に) 延ばす方法を探しているだけです。

kernel1上記の変更により、プロファイラー であなたの重複が見られました。ここに画像の説明を入力

あなたの で同様のことができると思いますkernel2

でプロファイリング セッションを開始するときに、[同時カーネル プロファイリングを有効にする] チェックボックスの選択を解除していないことも確認する必要がありますnvvp

于 2013-09-16T23:20:05.593 に答える