-2
CUDAを使用してCでコーディングすることに関わる課題に取り組んでいます。私は関数と正しい(結果を出す)カーネルを作成しました。しかし、私はスピードを上げるために探しています。ループ内でのCUDAコピーとカーネルコール
これはカーネルです:
__global__ void update_c(const double *d_u, double *d_u_new, const int nx, const double k)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < nx-1 && i > 0)
{
d_u_new[i] = d_u[i] + k*(d_u[i+1] + d_u[i-1] -2*d_u[i]);
}
}
、これが関数である:
void update() {
cudaMemcpy(d_u, u, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_u_new, u_new, size, cudaMemcpyHostToDevice);
update_c<<<blocksPerGrid, threadsPerBlock>>>(d_u, d_u_new, nx, k);
cudaMemcpy(u, d_u, size, cudaMemcpyDeviceToHost);
cudaMemcpy(u_new, d_u_new, size, cudaMemcpyDeviceToHost);
double *tmp = u_new; u_new = u; u = tmp;
}
私は、私はそれらをコピーする必要はありませんので、一度コピーd_uとd_u_newは、デバイス上にとどまることを理解毎回。私の質問は、変数を繰り返し使用するためにこれを書き直し、プログラムの開始時と終了時にのみメモリをコピーする方法です。私はCUDAのブランドが新しく、これが割り当てられる前に、非常に短いクラッシュコースしか持っていませんでした。
実際に知るには、 'update()'を呼び出すコードが必要です。コンテキストを追加できますか? –