2016-12-08 11 views
-5

同じCUDAソースファイル内で、異なるものを計算する2つのグローバル関数を別々に書くことはできますか?このようなもの:同じCUDAソースファイル内の複数のグローバル関数

__global__ void Ker1(mpz_t *d,mpz_t *c,mpz_t e,mpz_t n) 
{ 
    int i=blockIdx.x*blockDim.x + threadIdx.x; 

    mpz_powm (d[i], c[i], e, n); 

} 

__global__ void Ker2(mpz_t *d,mpz_t *c,mpz_t d, mpz_t n) 
{ 
    int i=blockIdx.x*blockDim.x + threadIdx.x; 
    mpz_powm(c[i], d[i],d, n); 

} 


int main() 
{ 
    /* ... */ 
    cudaMemcpy(decode_device,decode_buffer,memSize,cudaMemcpyHostToDevice); 
    Ker1<<<dimGrid , dimBlock >>>(d_device,c_device,e,n); 
    Ker2<<<dimGrid , dimBlock>>>(c_device,d_device,d,n); 
    cudaMemcpy(decode_buffer,decode_device,memSize,cudaMemcpyDeviceToHost); 
} 

もしそうなら、あなたはどうしますか?

+0

タグをスパムしないでください。 – Olaf

+3

ただ試してみてください... – tera

+0

同じソースファイルに書かれた別のカーネルに関する質問に答えようとしました。しかし、次回は質問を改善することを検討してください。 – Taro

答えて

1

あなたが求めていることはかなり不明ですが、3回の読みの後に私は仮定します:"同じソースファイルに複数のカーネルを書き込めますか?"。 あなたはあなたのメインの機能に必要なだけ多くのカーネルを書くことができます。ここでは、9ページの

例:

... 
cudaMemcpy(dev1, host1, size, H2D) ; 
kernel2 <<< grid, block, 0 >>> (..., dev2, ... ) ; 
kernel3 <<< grid, block, 0 >>> (..., dev3, ... ) ; 
cudaMemcpy(host4, dev4, size, D2H) ; 
... 

から:Streams and concurrency webinar

通話はそうとすぐにカーネルがGPUに発売されたように、CPUが処理します、デフォルトでは非同期になります続く指示 同期を強制するには、cudaDeviceSynchronize()を使用するか、cudaMemcpy経由で任意のメモリ転送を使用して同期を強制する必要があります。

出典:CUDA FAQところで

Q: Can the CPU and GPU run in parallel? Kernel invocation in CUDA is asynchronous, so the driver will return control to the application as soon as it has launched the kernel.

The "cudaThreadSynchronize()" API call should be used when measuring performance to ensure that all device operations have completed before stopping the timer.

CUDA functions that perform memory copies and that control graphics interoperability are synchronous, and implicitly wait for all kernels to complete.

あなたがカーネルの間で同期する必要がない場合は、お使いのGPUが必要な計算能力(CC)を持っていれば、彼らは同時に実行することができます。

Q: Is it possible to execute multiple kernels at the same time? Yes. GPUs of compute capability 2.x or higher support concurrent kernel execution and launches.

(まだからreaden CUDA FAQ)。

+0

それは動作しません:エラー:重複するパラメータ名 – wolfgunner

+2

これは、2つ目のカーネルが "d"という2つのパラメータを持っているからです。これはどのコンパイラでも動作しません。 私の答えはあなたの質問にあなたが何を求めているかを表しています。 あなたのエラーを貼り付けるだけで、エラーを解決するための努力をしていないようです。あなたのコードに誤りのないバージョンを与えることを期待しています。これは非常に疲れる行為ですが、私はこの話題のためにここで止めます。 – Taro

+0

あなたはまったく正しい、私はdのためにそれを言及しない、私は未来のために努力し、私は愚かな質問をしないかもしれないかもしれない...私は良い方法でそれを取るgracias。 – wolfgunner

関連する問題