c++ - Cuda GPU编译,我认为它没有使用GPU
问题描述
我尝试学习CUDA。它与 C 非常相似。我尝试在我的 GPU 中运行一些代码。但我认为这并不快,我认为这与我的代码有关。我想只有我 __global__ void func(ull* num1, ull* num2, ull* sum)
在 GPU 上工作。这就是我要的。但这并不快。我应该怎么办。
typedef uint64_t ull;
#define E1 1
#define E2 5000000000000000
__global__ void func(ull* num1, ull* num2, ull* sum)
{
for (ull i = *num1; i <= *num2; i++)
{
sum[0] += i;
}
}
int main()
{
ull n1 = E1;
ull n2 = E2;
ull sum = 0;
ull* d_n1;
ull* d_n2;
ull* d_sum;
cudaMalloc(&d_n1, sizeof(ull));
cudaMalloc(&d_n2, sizeof(ull));
cudaMalloc(&d_sum, sizeof(ull));
cudaMemcpy(d_n1, &n1, sizeof(ull), cudaMemcpyHostToDevice);
cudaMemcpy(d_n2, &n2, sizeof(ull), cudaMemcpyHostToDevice);
cudaMemcpy(d_sum, &sum, sizeof(ull), cudaMemcpyHostToDevice);
func <<<1,1000>>> (d_n1, d_n2, d_sum);
cudaMemcpy(&sum, d_sum, sizeof(ull), cudaMemcpyDeviceToHost);
std::cout << sum << std::endl;
cudaFree(d_n1);
cudaFree(d_n2);
return 0;
}
解决方案
GPU 和 CUDA 并不是“神奇地使程序快速运行”的技术。您必须并行化您的算法并使用多个线程。
目前,您的代码将在所有相关内核上的相同内存上执行完全相同的操作,这不仅浪费资源,而且还会绊倒自己,因为所有这些并发内存地址到同一位置会相互损害.
对数组求和也不是并行执行的“微不足道”的事情。您必须拆分和合并任务,递归处理。
你真的,绝对必须了解 GPU 的工作原理以及如何利用它们带来的东西。
推荐阅读
- build - 如何设置 TeamCity 构建触发器以使用环境参数
- reactjs - 如何在 Next.js 的服务器端访问自定义应用程序中的语言环境?
- plot - 如何使用 Julia 的 Plots 包绘制 3-D 函数?
- angular - Angular i18n 在切换语言时不理解路由
- firebase - 最实用的 Firestore 监听器:每条路径多个,还是一个做多个工作?
- scala - java.nio.file.NoSuchFileException:/home/jovyan/work/source/load-ivy.sc
- java - Springboot 堆栈跟踪日志过滤器仅来自我的包
- mysql - logstash的JDBC输入插件可以做多个sql任务吗?
- unity3d - Unity 2D 背景不适合
- linux - 神经项目电路 SPI 时钟未初始化