網頁

2019年2月8日 星期五

Page-Locked Host Memory

與Unlock Pages in Memory相比,Lock Pages in Memory速度更快。此安全性設定決定哪些使用者能使用處理程序來保留實體記憶體中的資料,阻止系統將資料分頁到磁碟上的虛擬記憶體,降低可用的隨機存取記憶體 (RAM) 數量,而對系統效能造成顯著影響。
CUDA提供了cudaHostAlloc和cudaHostRegister調用來分配或註冊頁面鎖定memory。如果主機memory被鎖定,Nvidia驅動程序會檢查memory傳輸,並根據複製代碼路徑發出問題。


1.cudaHostAlloc

#include <iostream>
#include <numeric>
#include <stdlib.h>

__global__ void add1(float* input){
    int idx = threadIdx.x;
    input[idx] += idx;
}
int main(void)
{
    float* temp;
    cudaHostAlloc(&temp, sizeof(float)*12, cudaHostAllocDefault);
    for(int i = 0; i < 12; ++i){
        temp[i] = i;
    }
    add1<<<1,12>>>(temp);
    for(int i = 0; i < 12; ++i){
        std::cout<< temp[i] << std::endl;
    }
    cudaFreeHost(temp);
    return 0;
}

2.cudaHostRegister and cudaHostGetDevicePointer
#include <iostream>
#include <numeric>
#include <stdlib.h>

__global__ void add1(float* input){
    int idx = threadIdx.x;
    input[idx] += idx;
}
int main(void)
{
    float* temp = (float*)malloc(sizeof(float)*12);
    cudaHostRegister(temp, sizeof(float)*12, cudaHostRegisterMapped);
    for(int i = 0; i < 12; ++i){
        temp[i] = i;
    }
    float* device;
    cudaHostGetDevicePointer(&device, temp, 0);
    add1<<<1,12>>>(device);
    for(int i = 0; i < 12; ++i){
        std::cout<< temp[i] << std::endl;
    }
    cudaHostUnregister(temp);
    return 0;
}

參考
https://blog.csdn.net/u012235274/article/details/52474504

沒有留言:

張貼留言