CUDA - 将CPU代码与CUDA代码分离

3

我希望在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内存中,这是一个额外的步骤。

2
通常来说,沟通越少越好。许多小事情可以在GPU上完成,成本比来回传输数据要小。因此,您不应该使用rand来获取随机数。 - Matthieu Brucher
1个回答

2
在这种情况下,您唯一需要做的就是用随机值初始化数组。数组的每个值可以独立初始化。 在数据初始化和传输到设备以及从主机返回的过程中,CPU会参与您的代码。
在您的情况下,您真的需要让CPU初始化数据,然后将所有这些值移动到GPU吗?
最好的方法是分配一些设备内存,然后使用内核初始化值。 这将节省时间,因为
- 元素是并行初始化的 - 不需要从主机到设备的内存传输
作为一个经验法则,如果可能的话,始终避免主机和设备之间的通信

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接