CUDA-将cpu代码与cuda代码分开

时间:2018-11-23 11:07:39

标签: c++ c++11 cuda

希望在CUDA内核中使用系统功能(例如rand())。但是,理想情况下,它将仅在CPU上运行。在仍使用gpu矩阵加法的情况下,是否可以分离文件(.cu和.c ++)?例如,遵循以下原则:

在main.cpp中:

int main(){
std::vector<int> myVec;
srand(time(NULL));

for (int i = 0; i < 1024; i++){
    myvec.push_back( rand()%26);
}

selfSquare(myVec, 1024);

}

和在cudaFuncs.cu中:

__global__ void selfSquare_cu(int *arr, n){
    int i = threadIdx.x;
    if (i < n){
        arr[i] = arr[i] * arr[i];
    }

}

void selfSquare(std::vector<int> arr, int n){
    int *cuArr;
    cudaMallocManaged(&cuArr, n * sizeof(int));
    for (int i = 0; i < n; i++){
        cuArr[i] = arr[i];
    }

    selfSquare_cu<<1, n>>(cuArr, n);
}

围绕此类情况的最佳做法是什么?使用curand在内核中编写所有内容会更好吗?在上面的示例中,对我来说,要提取向量并将其复制到共享的cuda内存,还有一个额外的步骤。

1 个答案:

答案 0 :(得分:2)

在这种情况下,您唯一需要做的就是用随机值初始化数组。数组的每个值都可以单独初始化。 在初始化以及将数据传输到设备然后再传输回主机的过程中,代码中都涉及CPU。

在您的情况下,您是否真的需要让CPU初始化数据以便将所有这些值移至GPU?

最好的方法是分配一些设备内存,然后使用内核初始化值。 这将节省时间,因为

  • 元素被并行初始化
  • 不需要从主机到设备的内存传输

根据经验,始终避免主机与设备之间的通信