如何判断Nvidia GPU内核是否为32/64位处理器

时间:2017-02-13 08:51:03

标签: gpu cpu-architecture instruction-set

是否有Linux / Windows命令显示Nvidia GPU中的处理器类型?我不是在谈论操作系统和CPU类型。我问的是GPU本身的处理器(核心)。在一天结束时,他们是处理器。如何判断它们是否具有32/64位寄存器和32/64位ALU?

与此相关的另一个问题是64位指令,例如添加两个(unsigned long int)数字,使用32位指令模拟,编译器或任何中间事物,或者它们是由本机执行的硬件?

这个问题与this不太相似,我需要一种方法来告诉GPU本身是什么类型的机器。此外,该问题的答案并未说明64位指令是如何具体执行的。

1 个答案:

答案 0 :(得分:0)

我编写了两个简单的内核。每一个都添加两个int(32位)/ long int(64位)类型的向量。事实证明,我的GPU(Tesla K80)恰好是新的和优秀的,核心只有32位。

随着矢量大小的增加,时间大致加倍。

内核如下:

__global__ void add_32(int * c, int * a, int * b)
{
    int gid = blockIdx.x * blockDim.x + threadIdx.x;
    c[gid] = a[gid] + b[gid];
}

typedef long int int64;

__global__ void add_64(int64 * c, int64 * a, int64 * b)
{
    int gid = blockIdx.x * blockDim.x + threadIdx.x;
    c[gid] = a[gid] + b[gid];
}

当矢量大小为1兆元素时,add_32大约需要102.911微秒,而add_64需要192.669微秒。 (在运行发布模式二进制文件时,使用Nvidia分析器报告执行时间。)

似乎只能通过32位指令模拟64位指令!

这可能是一个蛮力的解决方案,可以找出什么样的机器是GPU内核,但绝对不是一个优雅的。

更新

感谢@Paul A. Clayton的评论,上面的解决方案似乎不公平,因为64位情况下数据大小加倍。所以我们不应该启动具有相同数量元素的两个内核。正确的原则是使用一半数量的元素启动64位版本。

更确切地说,让我们考虑元素向量乘法而不是加法。如果GPU通过32位指令模拟64位指令,那么它需要至少3个32位乘法指令来使用可能的Karatsuba算法乘以2个64位数。这意味着如果我们使用N / 2个元素启动64位向量乘法内核,如果仅模拟64位乘法,则需要比具有N个元素的32位内核更长的时间。

以下是内核:

__global__ void mul_32(int * c, int * a, int * b)
{
    int gid = blockIdx.x * blockDim.x + threadIdx.x;
    c[gid] = a[gid] * b[gid];
}

typedef long int int64;

__global__ void mul_64(int64 * c, int64 * a, int64 * b)
{
    int gid = blockIdx.x * blockDim.x + threadIdx.x;
    c[gid] = a[gid] * b[gid];
}

以下是实验细节: 这里报道的时间来自发布模式二进制文件中的nvidia profiler: 1-内核mul_32,矢量大小N = 256兆元素,取25.608毫秒。 2-内核mul_64,矢量大小N = 128兆元素,需要24.153毫秒。

我知道两个内核都会产生不正确的结果,但我认为这与计算方式无关。