cuda为啥要开启32倍数的线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cuda为啥要开启32倍数的线程相关的知识,希望对你有一定的参考价值。

CUDA里,基本调度单位成为warp,一个warp由32个线程组成,所以一般情况下,建议使用32倍数来作为线程数。当然,并不是一定要32倍数的线程数,比如设置112个线程也是可以的,只不过,前96个线程分别组成3组warp,而后面16个线程实际在第4个warp里,只不过这个warp的后16个线程是用于补齐的,不会被调度执行而已! 参考技术A 32 个线程为单位进行调度,因此 Block 中的 Thread 数目应当 是 32 的倍数本回答被提问者和网友采纳

为啥我的java程序明明开启了4条线程,却只有一条线程在运行?

package com.heima.syn;

public class Demo4_Ticket

/**
* @param args
* 火车站卖票的例子用实现Runnable接口 //此办法做不出来
*/
public static void main(String[] args)
MyTicket mt = new MyTicket();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();

/*Thread t1 = new Thread(mt); //多次启动一个线程是非法的
t1.start();
t1.start();
t1.start();
t1.start();*/




class MyTicket implements Runnable
private int tickets = 100000;
@Override
public void run()
while(true)
synchronized(this)
if(tickets <= 0)
break;

try
Thread.sleep(10); //线程1睡,线程2睡,线程3睡,线程4睡
catch (InterruptedException e)

e.printStackTrace();

System.out.println(Thread.currentThread().getName() + "...这是第" + tickets-- + "号票");





结果
Thread-0...这是第100000号票
Thread-0...这是第99999号票
Thread-0...这是第99998号票
Thread-0...这是第99997号票
。。。。。。

参考技术A 是匿名对象的原因,匿名对象不是强引用,对象声明生命周期短,当第一条线程执行run之后,二三四条线程应该是被虚拟机回收了。一般多线程都不用匿名对象 参考技术B Thread t1 = new Thread(r1, "1号窗口");// 创建线程
Thread t2 = new Thread(r1, "2号窗口");// 创建线程
Thread t3 = new Thread(r1, "3号窗口");// 创建线程
Thread t4 = new Thread(r1, "4号窗口");// 创建线程
t1.start();
t2.start();
这样创建多线程
参考技术C 你要等待久一点,才可以看到其他的线程,因为线程是不稳定的。。。

以上是关于cuda为啥要开启32倍数的线程的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CUDA 中网格中的所有块的 Blockdim 都应该相同?

ubuntu 14.04 安装cuda,开启GPU加速

为啥我的java程序明明开启了4条线程,却只有一条线程在运行?

stm32 开启接收中断 PC 发送两次 为啥串口只接收到一次

如何开启显卡CUDA功能

怎么开启NVIDIA CUDA功能