CUDA 内核是否可以在没有任何主机端调用(例如 of )的情况下将写入同步到设备映射内存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 上使用 CUDA 4.2.9 为 sm_20 编译上述内容,并在 Fermi GPU (S2050) 上运行它。