cuda - CUDA 执行时间与块大小的比较
问题描述
目标很简单:使用 CUDA 绘制块大小对执行时间的影响。人们期望看到的是,对于每个是 32 倍数的块大小,执行时间最短,在这些倍数之后(例如 33、65、97、129,...),执行时间应该会增加。然而,这不是我得到的结果。执行时间只是下降然后变平。
我在 NVIDIA GeForce 940M 上运行 CUDA 运行时 10.0。
我尝试了几种获取执行时间的方法。CUDA 文档中推荐的一个说以下应该可以工作:
cudaEventCreate(&gpu_execution_start);
cudaEventCreate(&gpu_execution_end);
cudaEventRecord(gpu_execution_start);
kernel<<<n_blocks,blocksize>>> (device_a, device_b, device_out, arraysize);
cudaEventRecord(gpu_execution_end);
cudaEventSynchronize(gpu_execution_end);
然而,这种计时方式会产生前面提到的结果。
问题是否在于执行时间?或者特定的 GPU 是否会导致结果出现问题?
解决方案
因此,这些线程块中的每一个都将被转换为扭曲,并且当您将每个线程块的线程数增加 32 时,您每次都会减少发散线程的百分比。例如,如果您为每个线程块启动 33 个线程,则每个线程块将有 1 个扭曲,所有 32 个通道都处于活动状态,另一个只有 1 个通道处于活动状态。因此,在测试的每个增量中,您并没有增加发散量,您只是在该线程块中增加了 1 个活动扭曲。
如果您也没有正确扩展您的应用程序,那么无论如何您的所有工作都将能够同时安排,因此不会对执行时间产生任何影响。
希望这可以帮助!
推荐阅读
- linux - 如何安排 cron 在每个月的第一个星期四运行
- python - Django 错误:未定义 NameError 名称“db_table”
- java - 如何使用为 long 类型的参数定义的方法和 Double 类型的值?
- python - 如何在以键为占位符的python多维字典中使用带有executemany的Sqlite3 UPSERT来克服语法错误?
- android - 如何在具有中心裁剪的自定义图像视图中制作圆形图像?
- java - 在 javaFX 中填充一个简单的 TableColumn
- linux - 从日志中过滤特定的日期和时间范围 - 已解决
- react-native - React Native 0.61.2:pod install 抛出无法读取未定义的属性“projectPath”
- json - ICDI 中的 REG_EXTRACT 和 REG_REPLACE
- c# - C# WPF 自定义验证规则不会触发