【问题标题】:CUDA - separating cpu code from cuda codeCUDA - 将 cpu 代码与 cuda 代码分开
【发布时间】:2019-04-25 23:58:43
【问题描述】:

希望在 CUDA 内核中使用系统函数(例如 rand() )。但是,理想情况下,这只会在 CPU 上运行。我可以分离文件(.cu 和 .c++),同时仍然使用 gpu 矩阵加法吗?例如,大致如下:

在 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 内存中还有一个额外的步骤。

【问题讨论】:

  • 沟通越少,通常越好。与来回传输数据相比,可以在 GPU 上以更小的成本完成许多小事情。那么你不应该使用rand 来获取随机数。

标签: c++ c++11 cuda


【解决方案1】:

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

在您的情况下,您真的需要让 CPU 初始化数据,然后将所有这些值移至 GPU 吗?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2015-02-20
    • 1970-01-01
    相关资源
    最近更新 更多