如果我的算法由主机到设备和设备的瓶颈来承载内存传输,那么唯一的解决方案是不同的还是修改过的算法?
我有一个单词列表,我的目标是在一个非常长的短语中匹配每个单词。我在匹配每个单词时没有问题,我唯一的问题是返回包含有关每个匹配信息的结构向量。
在代码中:
typedef struct {
int A, B, C; } Match;
__global__ void Find(veryLongPhrase * _phrase, Words * _word_list, vector<Match> * _matches)
{
int a, b, c;
[...] //Parallel search for each word in the phrase
if(match) //When an occurrence is found
{
_matches.push_back(new Match{ A = a, B = b, C = c }); //Here comes the unknown, what should I do here???
}
}
main()
{
[...]
veryLongPhrase * myPhrase = "The quick brown fox jumps over the …Run Code Online (Sandbox Code Playgroud) 我的计算机上没有支持CUDA的显卡.我可以使用ssh(或其他)将NVIDIA Nsight连接到远程计算机吗?
当我安装nvidia专有驱动程序时,使用Nvidia OpenGL实现(我不需要Mesa).哪个OpenGL实现可以与开源的nvidia驱动程序一起使用 - Nouveau?Nouveau还提供OpenGL实现还是必须使用Mesa OpenGL实现?我可以使用带有Mesa OpenGL实现的nvidia驱动程序吗?有什么可能性?
可以说我有三个全局数组,这些全局数组已使用cudaMemcpy复制到了gpu中,但是c中的这些gloabl数组尚未使用cudaHostAlloc进行分配,因此无法分配页面锁定的内存,而是简单的gloabl分配。
int a[100],b [100],c[100];
cudaMemcpy(d_a,a,100*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(d_b,b,100*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(d_c,c,100*sizeof(int),cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)
现在我有10个内核,它们在单独的流中启动,以便可以并行运行,其中一些正在使用在gpu中复制的全局数组。现在这些内核正在运行1000次迭代。他们不需要在迭代过程中将任何内容复制回主机。
但是问题在于它们不是并行执行,而是以串行方式执行。
cudaStream_t stream[3];
for(int i=0;i<3;i++)cudaStreamCreate (&stream[i]);
for(int i=0;i<100;i++){
kernel1<<<blocks,threads,0,stream[0]>>>(d_a,d_b);
kernel2<<<blocks,threads,0,strea[1]>>(d_b,d_c);
kernal3<<<blocks,threads,0,stream[2]>>>(d_c,d_a);
cudaDeviceSynchronize();
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么?
在尝试使用NVEnc将OpenGL帧作为H264进行流式传输时,我碰到了一堵完整的砖墙.我已经在这个特殊问题上待了将近8个小时而没有任何进展.
问题是调用nvEncRegisterResource(),代码-23总是失败(枚举值NV_ENC_ERR_RESOURCE_REGISTER_FAILED,记录为"未能注册资源" - 感谢NVidia).
我正在尝试遵循奥斯陆大学本文档中概述的程序(第54页,"OpenGL互操作"),因此我知道这应该有用,但遗憾的是,该文档并未提供代码本身.
这个想法相当简单:
正如我所说,问题是第(3)步.以下是相关的代码片段(为简洁起见,我省略了错误处理.)
// Round up width and height
priv->encWidth = (_resolution.w + 31) & ~31, priv->encHeight = (_resolution.h + 31) & ~31;
// Allocate CUDA "pitched" memory to match the input texture (YUV, one byte per component)
cuErr = cudaMallocPitch(&priv->cudaMemPtr, &priv->cudaMemPitch, 3 * priv->encWidth, priv->encHeight);
Run Code Online (Sandbox Code Playgroud)
这应该分配设备上的CUDA内存("倾斜"类型,尽管我也尝试过非音调,但结果没有任何改变.)
// Register the CUDA buffer as an input resource
NV_ENC_REGISTER_RESOURCE regResParams = { 0 };
regResParams.version = NV_ENC_REGISTER_RESOURCE_VER;
regResParams.resourceType = NV_ENC_INPUT_RESOURCE_TYPE_CUDADEVICEPTR; …Run Code Online (Sandbox Code Playgroud) 我的开发工作站目前有NVIDIA Quadro K2200和K620.两者都具有CUDA计算能力5.0.然而,最终的生产系统有一个Tesla K80,具有CUDA计算能力3.7.
是否可以在我的Quadro GPU上安装和开发用于计算能力的CUDA程序3.7,然后将它们移动到K80而无需进行重大更改?
我有一块NVIDIA jetson TX1主板.我想安装caffe.根据Caffe的先决条件我安装了CUDA工具包https://developer.nvidia.com/cuda-downloads.后来我发现这个板有自己的安装说明.它需要10GB的空间而我没有它,因为我已经给了一些Caffe先决条件安装.现在我需要完全删除这个CUDA工具包.到目前为止,我找不到确定的方法.你能帮我么?
我使用的是ubunto 14.4.+ NVIDIA jetson TX1
根据大多数NVidia文档,CUDA核心是标量处理器,只应执行标量操作,这将被矢量化为32分量SIMT扭曲.
但OpenCL具有矢量类型,例如.uchar8它具有与ulong(64位)相同的大小,可以由单个标量核心处理.如果我对uchar8向量进行操作(例如,按组件添加),它是否也会映射到单个核心上的指令?
如果一个块(工作组)中有1024个工作项,并且每个工作项处理一个uchar8,那么这将有效地uchar并行处理8120 吗?
编辑:
我的问题是,如果在CUDA架构上(独立于OpenCL),在"标量"核心中有一些矢量指令可用.因为如果核心已经能够处理32位类型,例如它也可以处理32位的添加是合理的uchar4,特别是因为向量操作经常用在计算机图形中.
在GPU中,到L2高速缓存的事务可以是32B,64B或128B(读和写)的大小.并且可以使用诸如gst_transactions和gld_transactions之类的nvprof度量来测量此类事务的总数.但是,我无法找到任何详细说明如何映射这些事务以进行DRAM访问的材料,即这些事务如何由DRAM处理,而这些事务通常具有不同的总线宽度?例如,TitanXp GPU具有384位全局内存总线,P100具有3072位内存总线.那么32B,64B或128B指令如何映射到这些存储器总线.如何衡量DRAM控制器生成的事务数量?
PS:dram_read_transactions指标似乎没有这样做.我之所以这么说是因为我在TitanXp和P100上获得了相同的dram_read_transactions值(即使在顺序访问期间),尽管两者的总线宽度差异很大.