2017-04-13 3 views
-2

カーネルコール内のこのシーブコードから倍数を削除するはずですが、正しく実行しているかどうかわかりません。私が20000000よりも大きい値を入力するたびに、それは私に、このエラーを与える:より良いパフォーマンスのためにカーネルコールで倍数を削除する

Prime Sieve v1.0 [CUDA]
computing prime numbers up to but not including 20000000
========= Program hit error 9 on CUDA API call to cudaLaunch
========= Saved host backtrace up to driver entry point at error
========= Host Frame:/usr/lib64/nvidia/libcuda.so [0x2eeda3]
========= Host Frame:./sieve_cuda [0x3b27e]
========= Host Frame:./sieve_cuda [0x2e34]
========= Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xfd)
[0x1ed1d]
========= Host Frame:./sieve_cuda [0x2639]

これは、カーネルの呼び出しのための私のコードです:

static __global__ void SieveComputeKernel(const long top, bool array[]) 
{ 
    const int idx = threadIdx.x + blockIdx.x * blockDim.x; 
    if ((idx >= 2) && (idx * idx < top)) 
    { 
      int j = idx * idx; 
      while (j < top) 
      { 
      array[j] = false; 
      j += idx; 
     } 


    } 
    // ... //todo: remove multiples here 

} 

そして、これは私のカーネル呼び出しです:

SieveComputeKernel<<<(sqrt_top + ThreadsPerBlock - 1)/ThreadsPerBlock, 
    ThreadsPerBlock>>>(top, array_d); 

ここで、ThreadsPerBlockは256で、topはその番号 "2000000"です。

誰でも私に助けてくれますか?

+3

エラー9の起動時は無効な起動設定です。 20000000という値では、最初のカーネル起動パラメータは20000000/256で、78125であり、cc2.0デバイスの上限である65535よりも大きくなっています。 cc3.0以降のデバイスを使用している場合、デバイスのコンピューティング機能をコンパイルすると、この問題が発生する可能性があります。 –

+0

うん、それだった –

答えて

1

起動時のエラー9が無効な起動設定です。 (これはthe runtime API documentation、またはヘッダーファイルdriver_types.hにあります)。

値が20000000の場合、最初のカーネル起動パラメータは20000000/256で、78125であり、cc2.0デバイスの上限である65535より大きい値です。

cc3.0以降のデバイスを使用している場合、デバイスのコンピューティング機能(たとえばnvcc -arch=sm_30 ...)をコンパイルすると、この問題が発生する可能性があります。 (これは明らかにコメントに基づいて行われた)

関連する問題