最大工作组大小与翘曲大小之间的关系是什么?假设我的设备有240个CUDA流处理器(SP),并返回以下信息 -
CL_DEVICE_MAX_COMPUTE_UNITS:30
CL_DEVICE_MAX_WORK_ITEM_SIZES:512/512/64
CL_DEVICE_MAX_WORK_GROUP_SIZE:512
CL_NV_DEVICE_WARP_SIZE:32
这意味着每个流多处理器(即计算单元)有8个SP.现在warp size = 32与这些数字有关吗?
例如, cudaMalloc((void**)&device_array, num_bytes);
之前已经问过这个问题,回复是"因为cudaMalloc返回错误代码",但是我没有得到它 - 什么有双指针与返回错误代码有什么关系?为什么一个简单的指针不能完成这项工作?
如果我写
cudaError_t catch_status;
catch_status = cudaMalloc((void**)&device_array, num_bytes);
Run Code Online (Sandbox Code Playgroud)
错误代码将被放入catch_status,并返回一个指向分配的GPU内存的简单指针就足够了,不应该吗?
我正在研究一个统计应用程序,它在一个数组中包含大约10-30万个浮点值.
有几种方法在嵌套循环中对数组执行不同但独立的计算,例如:
Dictionary<float, int> noOfNumbers = new Dictionary<float, int>();
for (float x = 0f; x < 100f; x += 0.0001f) {
int noOfOccurrences = 0;
foreach (float y in largeFloatingPointArray) {
if (x == y) {
noOfOccurrences++;
}
}
noOfNumbers.Add(x, noOfOccurrences);
}
Run Code Online (Sandbox Code Playgroud)
当前的应用程序是用C#编写的,在Intel CPU上运行,需要几个小时才能完成.我不了解GPU编程概念和API,所以我的问题是:
任何帮助将受到高度赞赏.
我目前正在浏览http://code.google.com/p/stanford-cs193g-sp2010/上的教程示例以学习CUDA.__global__下面给出了演示功能的代码.它只创建了两个阵列,一个在CPU上,一个在GPU上,用7号填充GPU阵列,并将GPU阵列数据复制到CPU阵列中.
#include <stdlib.h>
#include <stdio.h>
__global__ void kernel(int *array)
{
int index = blockIdx.x * blockDim.x + threadIdx.x;
array[index] = 7;
}
int main(void)
{
int num_elements = 256;
int num_bytes = num_elements * sizeof(int);
// pointers to host & device arrays
int *device_array = 0;
int *host_array = 0;
// malloc a host array
host_array = (int*)malloc(num_bytes);
// cudaMalloc a device array
cudaMalloc((void**)&device_array, num_bytes);
int block_size = 128;
int grid_size = num_elements / block_size;
kernel<<<grid_size,block_size>>>(device_array); …Run Code Online (Sandbox Code Playgroud) 从我在这里读到的一些评论中,出于某种原因,对于像CUDA这样的并行实现,最好有Structure of Arrays(SoA)over Array of Structures(AoS)吗?如果这是真的,谁能解释为什么?提前致谢!
在多GPU计算机中,如何指定应运行CUDA作业的GPU?
作为一个例子,在安装CUDA时,我选择安装NVIDIA_CUDA-<#.#>_Samples然后运行几个nbody模拟实例,但它们都在一个GPU 0上运行; GPU 1完全空闲(使用监控watch -n 1 nvidia-dmi).检查CUDA_VISIBLE_DEVICES使用
echo $CUDA_VISIBLE_DEVICES
Run Code Online (Sandbox Code Playgroud)
我发现这没有设定.我尝试使用它
CUDA_VISIBLE_DEVICES=1
Run Code Online (Sandbox Code Playgroud)
然后nbody再次运行但它也进入了GPU 0.
我看了相关的问题,如何选择指定的GPU来运行CUDA程序?,但deviceQuery命令不在CUDA 8.0 bin目录中.除此之外$CUDA_VISIBLE_DEVICES$,我看到其他帖子引用环境变量,$CUDA_DEVICES但这些没有设置,我没有找到有关如何使用它的信息.
虽然与我的问题没有直接关系,但是使用nbody -device=1我能够让应用程序在GPU 1上运行但是使用nbody -numdevices=2不能在GPU 0和1上运行.
我在使用bash shell运行的系统上测试这个,在CentOS 6.8上,使用CUDA 8.0,2 GTX 1080 GPU和NVIDIA驱动程序367.44.
我知道在使用CUDA编写时,您可以管理和控制要使用的CUDA资源,但在运行已编译的CUDA可执行文件时,如何从命令行管理?
我得到的是什么blockDim,但我有问题gridDim. Blockdim给出块的大小,但是什么gridDim?在互联网上它说明gridDim.x了x坐标中的块数.
我怎么知道是什么blockDim.x * gridDim.x给出的?
我怎么知道gridDim.xx行中有多少个值?
例如,请考虑以下代码:
int tid = threadIdx.x + blockIdx.x * blockDim.x;
double temp = a[tid];
tid += blockDim.x * gridDim.x;
while (tid < count)
{
if (a[tid] > temp)
{
temp = a[tid];
}
tid += blockDim.x * gridDim.x;
}
Run Code Online (Sandbox Code Playgroud)
我知道tid从0开始.代码然后有tid+=blockDim.x * gridDim.x.什么是tid现在这个手术后?
我对与HPC计算相关的术语完全不熟悉,但我刚刚看到EC2在AWS上发布了他们的新型实例,该实例由新的Nvidia Tesla V100提供支持,它具有两种"核心":Cuda Cores(5.120),以及张量核心(640).两者有什么区别?
编写CUDA应用程序时,您可以在驱动程序级别或运行时级别工作,如此图像所示(库是CUFFT和CUBLAS用于高级数学运算):

(来源:tomshw.it)
我假设两者之间的权衡是低级API的性能提升,但代价是代码的复杂性增加.有什么具体的差异,是否有任何重要的事情,你不能用高级API?
我正在使用CUDA.net与C#进行互操作,它是作为驱动程序API的副本构建的.这鼓励在C#中编写许多相当复杂的代码,而使用运行时API的C++等效代码更简单.这样做有什么可以赢的吗?我能看到的一个好处是,将智能错误处理与其余的C#代码集成起来更容易.
我是Thrust的新手.我看到所有Thrust演示文稿和示例仅显示主机代码.
我想知道我是否可以将device_vector传递给我自己的内核?怎么样?如果是,内核/设备代码中允许的操作是什么?