CUDAカーネルが、ホスト側の呼び出し(たとえば、)なしでデバイスマップトメモリへの書き込みを同期することは可能cudaDeviceSynchronize
ですか?次のプログラムを実行すると、カーネルの起動直後にページロックされたホストメモリを調べてもメモリの変更が表示されないため、カーネルはデバイスにマップされたメモリへの書き込みが完了するのを待ってから終了するようには見えません(遅延が挿入されるか、への呼び出しcudaDeviceSynchronize
がコメント化されていない場合を除きます):
#include <stdio.h>
#include <cuda.h>
__global__ void func(int *a, int N) {
int idx = threadIdx.x;
if (idx < N) {
a[idx] *= -1;
__threadfence_system();
}
}
int main(void) {
int *a, *a_gpu;
const int N = 8;
size_t size = N*sizeof(int);
cudaSetDeviceFlags(cudaDeviceMapHost);
cudaHostAlloc((void **) &a, size, cudaHostAllocMapped);
cudaHostGetDevicePointer((void **) &a_gpu, (void *) a, 0);
for (int i = 0; i < N; i++) {
a[i] = i;
}
for (int i = 0; i < N; i++) {
printf("%i ", a[i]);
}
printf("\n");
func<<<1, N>>>(a_gpu, N);
// cudaDeviceSynchronize();
for (int i = 0; i < N; i++) {
printf("%i ", a[i]);
}
printf("\n");
cudaFreeHost(a);
}
Linux上のCUDA4.2.9を使用してsm_20について上記をコンパイルし、Fermi GPU(S2050)で実行しています。