【发布时间】:2021-01-02 01:01:57
【问题描述】:
如果我的用户有一个兼容 CUDA 的 GPU,我想并行化一些计算,否则我想在 CPU 上执行相同的代码。我不想有两个版本的算法代码,一个用于 CPU,一个用于 GPU 维护。我正在考虑以下方法,但想知道额外的间接级别是否会影响性能,或者是否有更好的做法。
对于我的测试,我采用了基本的 CUDA 模板,该模板将两个整数数组的元素相加并将结果存储在第三个数组中。我删除了实际的添加操作,并将其放入自己的函数中,并标有设备和主机指令...
__device__ __host__ void addSingleItem(int* c, const int* a, const int* b)
{
*c = *a + *b;
}
...然后修改内核以在threadIdx标识的元素上调用上述函数...
__global__ void addKernel(int* c, const int* a, const int* b)
{
const unsigned i = threadIdx.x;
addSingleItem(c + i, a + i, b + i);
}
所以现在我的应用程序可以检查是否存在 CUDA 设备。如果找到我可以使用...
addKernel <<<1, size>>> (dev_c, dev_a, dev_b);
...如果不是,我可以放弃并行化并遍历调用函数主机版本的元素...
int* pA = (int*)a;
int* pB = (int*)b;
int* pC = (int*)c;
for (int i = 0; i < arraySize; i++)
{
addSingleItem(pC++, pA++, pB++);
}
在我的小型测试应用程序中似乎一切正常,但我担心涉及的额外调用。设备到设备的函数调用是否会导致任何显着的性能损失?我应该采用更普遍接受的 CPU 回退方式吗?
【问题讨论】:
标签: cuda