CUDA-将cpu代码与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内存中。

在这种情况下,您唯一需要的就是用随机值初始化数组。数组的每个值都可以独立初始化。在初始化和将数据传输到设备并返回到主机的过程中,CPU会参与您的代码。

在你的情况下,你真的需要CPU来初始化数据,然后将所有这些值移动到GPU吗?

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

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

根据经验,尽可能避免主机和设备之间的通信

最新更新