我正在尝试添加两个4800x9600矩阵,但遇到了困难......
这是一个简单的C = A + B操作......
这是内核:
__global__ void matAdd_kernel(float* result,float* A,float* B,int size)
{
int x=blockIdx.x*blockDim.x+threadIdx.x;
int y=blockIdx.y*blockDim.y+threadIdx.y;
int idx=x*y+x;
if(idx<size)
{
result[idx]=A[idx]+B[idx];
}
}
Run Code Online (Sandbox Code Playgroud)
这是代码:
void matAdd(Matrix C,Matrix A,Matrix B)
{
int N=A.w*A.h;
dim3 dimBlock=dim3(22,22);
int yBlocks=A.w/dimBlock.y+((A.w%dimBlock.y)==0?0:1); //yBlocks is 219 for dimBlock(22,22) and 9600x4800
int xBlocks=A.h/dimBlock.x+((A.h%dimBlock.x)==0?0:1); //xBlocks is 437 for dimBlock(22,22) and 9600x4800
dim3 dimGrid=dim3(xBlocks,yBlocks);
matAdd_kernel<<<dimGrid,dimBlock>>>(C.data,A.data,B.data,N);
cutilCheckMsg("kernel launch failure");
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Matrix如下:
typedef struct{
int w;
int h;
float* data;
}Matrix;
Run Code Online (Sandbox Code Playgroud)
这是我打印前10行和后10行时的输出:
top-10 rows A:
-0.023930 0.047744 -0.074694 0.053555 …Run Code Online (Sandbox Code Playgroud) 我有一个执行有限差分计算的CUDA代码.该代码在Tesla M2090处理器上运行良好,没有错误.相同的代码会导致Tesla T10处理器出现大量错误.我的结果中得到了很多零.
有谁知道这两种架构之间的区别以及如何解决问题的解决方案
我正在研究如何将每行的可变宽度的2D数组复制到GPU中.
int rows = 1000;
int cols;
int** host_matrix = malloc(sizeof(*int)*rows);
int *d_array;
int *length;
...
Run Code Online (Sandbox Code Playgroud)
每个人host_matrix[i]可能都有不同的长度,我知道length[i],问题就出在那里.我想避免复制虚拟数据.有没有更好的方法呢?
根据这个帖子,这不是一个聪明的方法:
cudaMalloc(d_array, rows*sizeof(int*));
for(int i = 0 ; i < rows ; i++) {
cudaMalloc((void **)&d_array[i], length[i] * sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)
但我想不出任何其他方法.有没有其他更聪明的方法呢?可以使用cudaMallocPitch和cudaMemCpy2D进行改进吗?
我使用NVIDIA CUDA 5工具包在我的笔记本电脑上编译了一个cu程序.一个非常基本的接口,仅使用终端输出.然后我继续测试它在我的台式PC上运行的方式(两者都安装了Ubuntu 12.04 LTS).
在桌面PC上我收到此错误消息:
加载共享库时出错:libcudart.so.5.0:无法打开共享对象文件:没有这样的文件或目录
好的,我明白了,有些lib没有安装.但是我真的需要在每台我想要编译代码的PC上安装CUDA工具包吗?
在NVIDIA的2.x架构中,每个warp都有64kb的内存,默认情况下分为48kb的共享内存和16kb的L1缓存(服务global和constant内存).
我们都知道访问共享内存的银行冲突 - 内存分为32个大小为32位的存储区,允许所有32个线程同时独立访问.另一方面,全局内存虽然慢得多,但不会遇到银行冲突,因为内存请求在整个warp中合并.
问题: 假设来自全局或常量内存的一些数据缓存在L1缓存中以用于给定的warp.访问此数据是否存在银行冲突,例如共享内存(因为L1缓存和共享内存实际上是相同的硬件),还是以全局/常量内存的方式无冲突?
在主机代码中,__CUDA_ARCH__宏似乎不会生成不同的代码路径,相反,它将生成代码以确保当前设备的代码路径.
但是,如果__CUDA_ARCH__在设备代码中,它将为编译选项(/ arch)中指定的不同设备生成不同的代码路径.
谁能证实这是正确的?
我使用CUDA流实现了以下类
class CudaStreams
{
private:
int nStreams_;
cudaStream_t* streams_;
cudaStream_t active_stream_;
public:
// default constructor
CudaStreams() { }
// streams initialization
void InitStreams(const int nStreams = 1) {
nStreams_ = nStreams;
// allocate and initialize an array of stream handles
streams_ = (cudaStream_t*) malloc(nStreams_*sizeof(cudaStream_t));
for(int i = 0; i < nStreams_; i++) CudaSafeCall(cudaStreamCreate(&(streams_[i])));
active_stream_ = streams_[0];}
// default destructor
~CudaStreams() {
for(int i = 0; i<nStreams_; i++) CudaSafeCall(cudaStreamDestroy(streams_[i])); }
};
Run Code Online (Sandbox Code Playgroud)
如果我现在运行这个简单的代码
void main( int argc, char** argv)
{
streams.InitStreams(1);
streams.~CudaStreams(); …Run Code Online (Sandbox Code Playgroud) 现在,如果我使用此代码尝试在GeForce GTX460SE(CC2.1)中使用CUDA5.5从CPU-Cores访问GPU-RAM,那么我会收到异常"访问冲突":
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
int main()
{
unsigned char* gpu_ptr = NULL;
cudaMalloc((void **)&gpu_ptr, 1024*1024);
*gpu_ptr = 1;
int q; std::cin >> q;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我们知道,有UVA(统一虚拟寻址).还有一些新的:
是否可以通过使用新CUDA6中的简单指针从CPU-Cores访问内存GPU-RAM?
有没有人设法获得一个CUDA计划来处理NVidia盾牌?特别是让精彩的NVidia分析工具运行起来?
就像标题所说的那样,directx是否会以任何方式使用引擎盖下的nvidia卡的CUDA库/扩展?
基本上,引导下的directx库实际上是通过CUDA库调用CUDA内核吗?