1

「visualstudio2010」でWin8とNsightを使用していて、グラフィックカード(9300m Gs)に「310.90-notebook-win8-win7-winvista-32bit-international-whql」をインストールしましたが、以下のコードを試してみると、黒い画面が表示されます!「ディスプレイドライバが応答を停止し、回復しました」というエラーが表示されます。問題は「cudaMemcpy」にあることは知っていますが、なぜですか!?

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

#define N 8
__global__ void kernel(int *a)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int step = x;
while(step<N){
    a[step] =  threadIdx.x;
    step += x;
}
}

int main()
{
int a[N],i=N,j=0;
for(;j<N;j++)
    a[j]=i--;

int *dev_a;
cudaMalloc( (void**)&dev_a, N * sizeof(int) );
cudaMemcpy( dev_a, a, N * sizeof(int), cudaMemcpyHostToDevice);

    kernel<<<2,2>>>(dev_a);

cudaError_t cudaStatus = cudaMemcpy(a, dev_a,N-1 * sizeof(int), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
    fprintf(stderr, "cudaMemcpy failed!");
    //goto Error;
}

for(j=0;j<N;j++)printf("\n%d",a[j]);

int t;
scanf("%d",&t);
}
4

1 に答える 1

10

カーネルでは、threadIdx.x= 0 およびblockIdx.x= 0 のスレッド、つまり最初のブロックの最初のスレッドが無期限に実行され、カーネルがクラッシュします。

threadIdx.x= 0 および= 0 の場合blockIdx.x、カーネル コードは次のようになります。

int x = 0;
int step = 0;
while(step<N)
{
    a[step] =  0;
    step += 0; //This will create infinite loop
}

また(タイプミスの可能性があります)、コードの次の行に論理エラーがあります。

cudaError_t cudaStatus = cudaMemcpy(a, dev_a,N-1 * sizeof(int), cudaMemcpyDeviceToHost);

C での演算子の優先順位を考慮すると、式は(if is 4)N-1 * sizeof(int)に評価されます。N-4sizeof(int)

于 2013-01-28T06:47:27.277 に答える