这个问题说的都是真的.我希望我不必在c ++ .dll中编写代码,然后从托管代码中调用它.
我有以下矩阵乘法代码,使用CUDA 3.2和VS 2008实现.我在Windows server 2008 r2 enterprise上运行.我正在运行Nvidia GTX 480.以下代码适用于"宽度"(矩阵宽度)的值高达约2500左右.
int size = Width*Width*sizeof(float);
float* Md, *Nd, *Pd;
cudaError_t err = cudaSuccess;
//Allocate Device Memory for M, N and P
err = cudaMalloc((void**)&Md, size);
err = cudaMalloc((void**)&Nd, size);
err = cudaMalloc((void**)&Pd, size);
//Copy Matrix from Host Memory to Device Memory
err = cudaMemcpy(Md, M, size, cudaMemcpyHostToDevice);
err = cudaMemcpy(Nd, N, size, cudaMemcpyHostToDevice);
//Setup the execution configuration
dim3 dimBlock(TileWidth, TileWidth, 1);
dim3 dimGrid(ceil((float)(Width)/TileWidth), ceil((float)(Width)/TileWidth), 1);
MatrixMultiplicationMultiBlock_Kernel<<<dimGrid, dimBlock>>>(Md, Nd, Pd, Width);
err = …Run Code Online (Sandbox Code Playgroud) 在C++ AMP中,内核函数或lambda标记为restrict(amp),这对C++的允许子集(此处列出)施加了严格的限制.CUDA是否允许内核函数中C或C++子集的更多自由?
我正在使用CUDA,我试图阻止我的内核工作(即终止所有正在运行的线程)在某个if块被命中后.我怎样才能做到这一点?我真的被困在这里.
我想开展一个长达2-3个月的项目(全职),涉及用C++编码,并与网络(协议栈)相关.我正在考虑编写自己的网络堆栈,但这看起来并不那么有趣.很高兴找到一个为分布式系统/ GPU实现类似tcp/ip的堆栈的想法,就网络性能而言更好.我一直在谷歌搜索3个小时,但没有看到任何看起来值得花2个月的东西.像netperf这样的开源项目似乎超出了我的范围.我真的很喜欢一个相对较小的独立项目,我可以按照自己的步调进行工作.这个项目的目的是利用我的项目空闲时间(我可能稍后在开源许可下发布),并获得C++,网络,并行编程,GPU,分布式系统等方面的专业知识和实践经验.
我似乎在找到想法时遇到了障碍(或者我可能不太清楚我究竟该做什么).所以任何建议都会非常感激.谢谢!
一位电气工程师最近告诫我不要使用GPU进行科学计算(例如,准确性非常重要),因为没有像CPU那样的硬件保护措施.这是真的,如果是这样,典型硬件中的问题有多常见/实质性?
需要使用哪些库或函数来客观地比较CPU和GPU性能?为了准确评估,应该警告什么警告?
我使用Ubuntu平台和具有计算能力的设备2.1并使用CUDA 5工具包.
假设我们有一个数组int * data,每个线程将访问该数组的一个元素.由于此数组将在所有线程之间共享,因此它将保存在全局内存中.
让我们创建一个测试内核:
__global__ void test(int *data, int a, int b, int c){ ... }
Run Code Online (Sandbox Code Playgroud)
我确定data数组将在全局内存中,因为我使用了为这个数组分配了内存cudaMalloc.至于其他变量,我已经看到一些传递整数而不分配内存的例子,立即到内核函数.在我的情况下,这些变量是a b和c.
如果我没有记错的话,即使我们不直接调用cudaMalloc分配4个字节为每三个整数,CUDA会自动为我们做,所以最后的变数a b和c将在全球内存中分配.
现在这些变量只是辅助的,线程只读取它们而没有别的.
我的问题是,将这些变量传输到共享内存不是更好吗?
我想如果我们有例如10带有1024线程的块,我们需要10*3 = 30读取4字节以便将数字存储在每个块的共享内存中.
如果没有共享内存,并且每个线程必须读取所有这三个变量一次,那么全局内存读取的总量将1024*10*3 = 30720是非常低效的.
现在,这里的问题是,我有点新的CUDA和我不知道是否有可能转移内存变量a b和c每个块的共享内存,而不必每个线程从全局存储器读取这些变量并加载它们到共享内存,所以最终全局内存读取的总量将是1024*10*3 = 30720和否10*3 = 30.
在以下网站上有这个例子:
__global__ void staticReverse(int *d, int n)
{
__shared__ …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我在用户系统上的GPU之间分配处理负载.基本上,每个GPU都有CPU线程,当主应用程序线程定期触发时,它会启动GPU处理间隔.
考虑以下图像(使用NVIDIA的CUDA探查器工具生成)作为GPU处理间隔的示例- 此处应用程序使用单个GPU.

正如您所看到的,两个排序操作消耗了大部分GPU处理时间,而我正在使用Thrust库(thrust :: sort_by_key).此外,看起来push :: sort_by_key会在启动实际排序之前调用几个cudaMallocs.
现在考虑应用程序在两个GPU上分散处理负载的相同处理间隔:

在完美的世界中,您可以预期2 GPU处理间隔恰好是单GPU的一半(因为每个GPU的工作量只有一半).正如你所看到的,部分原因并非如此,因为cudaMallocs由于某种争用问题而被同时调用(有时长2-3倍)时似乎需要更长的时间.我不明白为什么会出现这种情况,因为2个GPU的内存分配空间是完全独立的,因此cudaMalloc上不应该有系统范围的锁定 - 每GPU锁定会更合理.
为了证明我的假设问题是同时使用cudaMalloc调用,我创建了一个非常简单的程序,它有两个CPU线程(每个GPU),每个线程多次调用cudaMalloc.我首先运行此程序,以便单独的线程不会同时调用cudaMalloc:

你看,每次分配需要大约175微秒.接下来,我用同时调用cudaMalloc的线程运行程序:

在这里,每个呼叫比前一个案例花了大约538微秒或3倍!毋庸置疑,这极大地减慢了我的应用程序,并且理所当然,只有2个以上的GPU才会使问题变得更糟.
我在Linux和Windows上注意到了这种行为.在Linux上,我使用的是Nvidia驱动程序版本319.60,而在Windows上我使用的是327.23版本.我正在使用CUDA工具包5.5.
可能的原因: 我在这些测试中使用的是GTX 690.这张卡基本上是2 680个GPU,安装在同一个单元中.这是我运行的唯一"多GPU"设置,所以cudaMalloc问题可能与690的2 GPU之间的硬件依赖性有关吗?
我在我的项目中研究了cuDNN库的使用.但我的nvidia显卡有点旧.
如果cuDNN适用于所有图形卡,我在网上搜索.即使在他们的主页中我也找不到.
哪些nvidia显卡与cuDNN兼容?
gpu-programming ×10
cuda ×7
gpu ×5
nvidia ×3
c++ ×2
.net ×1
c ×1
c++-amp ×1
gpgpu ×1
measurement ×1
multi-gpu ×1
networking ×1
thrust ×1
time ×1