Tag: cuda

尝试写入使用cudaMalloc3D分配的2D数组时的“非法内存访问”

我正在尝试使用cudaMalloc3D将扁平2Darrays的内存分配并复制到设备上,以测试cudaMalloc3D的性能。 但是当我尝试从内核写入数组时,它会抛出’遇到非法内存访问’exception。 如果我只是从数组中读取,但是当我尝试写入它时,程序运行正常,则会出错。 任何有关这方面的帮助将不胜感激。 下面是我的代码和编译代码的语法。 编译使用 nvcc -O2 -arch sm_20 test.cu 代码:test.cu #include #include #include #define PI 3.14159265 #define NX 8192 /* includes boundary points on both end */ #define NY 4096 /* includes boundary points on both end */ #define NZ 1 /* needed for cudaMalloc3D */ #define N_THREADS_X 16 #define N_THREADS_Y 16 #define […]

针对VS2010在CUDA C中编译计算能力2.x.

我是这样的: 在__device / global__ CUDA内核中动态分配内存 但它仍然无法编译。 error : calling a host function(“_malloc_dbg”) from a __device__/__global__ function(“kernel”) is not allowed error MSB3721: The command “”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA \v4.1\bin\nvcc.exe” -gencode=arch=compute_20,code=\”sm_20,compute_20\” –use-local-env –cl-version 2010 -ccbin “c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64″ -I”..\..\..\Source\Include” -G0 –keep-dir “x64\Debug” -maxrregcount=0 –machine 64 –compile -g -Xcompiler “/EHsc /nologo /Od /Zi /MDd […]

简单的CUDA内核没有按预期返回值

所以,我开始对CUDA感到非常沮丧,所以我决定编写最简单的代码片段,只是为了得到我的支持。 但似乎有些事情在我脑海中浮现。 在我的代码中,我只是添加两个数组,然后将它们存储在第三个数组中,如下所示: #include #include __global__ void add(int* these, int* those, int* answers) { int tid = blockIdx.x; answers[tid] = these[tid] + those[tid]; } int main() { int these[50]; int those[50]; int answers[50]; int *devthese; int *devthose; int *devanswers; cudaMalloc((void**)&devthese, 50 * sizeof(int)); cudaMalloc((void**)&devthose, 50 * sizeof(int)); cudaMalloc((void**)&devanswers, 50 * sizeof(int)); int i; for(i = […]

如何使用我现有的.cpp代码与cuda

我用c ++编写代码,想和cuda一起使用。任何人都可以帮帮我吗? 我应该提供我的代码吗? 实际上我尝试这样做,但我需要一些启动代码来继续我的代码。我知道如何为Windows(视觉工作室)做简单的方形程序(使用cuda和c ++)。是否足以为我的程序做事情?

为什么时序会随着输入数据中的零数量而急剧变化?

我在调试时遇到了这个奇怪的问题。 在我的代码中,我可以通过两种方式初始化主机数组srcArr_h[totArrElm] : 1) for(int ic=0; ic<totArrElm; ic++) { srcArr_h[ic] = (float)(rand() % 256); } 要么 2) (半数组元素将在运行时设置为零) for(int ic=0; ic<totArrElm; ic++) { int randV = (rand() % 256); srcArr_h[ic] = randV%2; } 如果我使用这些数组作为内核函数的输入,我会得到截然不同的时序。 特别是如果totArrElm = ARRDIM*ARRDIM , ARRDIM = 8192 ,我得到了 Timimg 1) 64599.3 ms Timimg 2) 9764.1 ms 有什么诀窍? 当然我确实validation了src主机初始化不会影响我得到的大时差。 这对我来说听起来非常严格,但可能是因为在运行时进行了优化吗? 这是我的代码: #include […]

返回指向设备分配矩阵的指针从C到Fortran

首先,我是Fortran / C / CUDA的新手。 其次,我正在研究一个使用cuBLAS在GPU上执行矩阵向量乘法的Fortran / C程序。 在需要更新矩阵内容之前,我需要将多个(最多1000个)向量与一个矩阵相乘。 但是,每当新的向量发送到GPU时,我必须重新分配矩阵的当前版本(由于矩阵没有改变,这非常浪费和缓慢)。 我希望能够将矩阵与向量相乘,而无需为每个向量重新分配矩阵。 我所涉及的一个想法是调用一个单独的C函数,它将矩阵分配给GPU,返回指向Fortran主程序的指针,然后调用执行矩阵向量乘法的另一个C函数。 使用ISO_C_BINDING,我向变量返回一个指向浮点数的指针: type(C_PTR) :: ptr 当我尝试将其传递给矩阵向量C函数时: 在Fortran call cudaFunction(ptr,vector, N) 在C. extern “C” void cudaFunction_(float *mat, float *vector, int *N) 一切都编译并运行,但是cublasSgemv的执行无法执行。 关于为什么会发生这种情况的任何想法? 我已经看到了一些相关的post,但他们从未尝试将返回的指针发送回C,这就是(我相信)我遇到的问题。 提前致谢!

Thrust – 如何使用我的数组/数据 – 模型

我是新手(cuda),我想做一些arrays操作,但我没有在互联网上找到任何类似的例子。 我有两个数组(2d): a = { {1, 2, 3}, {4} } b = { {5}, {6, 7} } 我想要推力计算这个数组: c = { {1, 2, 3, 5}, {1, 2, 3, 6, 7}, {1, 2, 3, 5}, {1, 2, 3, 6, 7} } 我知道它在c / c ++中是如何工作的,但不知道怎么说要做到这一点。 这是我的想法,它可能如何工作: 线程1:取一个[0] – >用b展开它。 写给c。 线程2:取一个[1] – >用b展开它。 写给c。 但我不知道该怎么做。 我可以将数组a和b写入1d数组,如: […]

将多分支树复制到GPU内存

我有一个节点树,我试图将其复制到GPU内存。 Node看起来像这样: struct Node { char *Key; int ChildCount; Node *Children; } 我的复制function如下所示: void CopyTreeToDevice(Node* node_s, Node* node_d) { //allocate node on device and copy host node cudaMalloc( (void**)&node_d, sizeof(Node)); cudaMemcpy(node_d, node_s, sizeof(Node), cudaMemcpyHostToDevice); //test printf(“ChildCount of node_s looks to be : %d\n”, node_s->ChildCount); printf(“Key of node_s looks to be : %s\n”, node_s->Key); Node *temp; […]

如何正确测量CUDA时间?

我试图正确测量并行和顺序执行的时间,但我怀疑是因为: 假设我们有以下代码: //get the time clock_t start,finish; double totaltime; start = clock(); double *d_A, *d_B, *d_X; cudaMalloc((void**)&d_A, sizeof(double) * Width * Width); cudaMalloc((void**)&d_B, sizeof(double) * Width); cudaMalloc((void**)&d_X, sizeof(double) * Width); cudaMemcpy(d_A, A, sizeof(double) * Width * Width, cudaMemcpyHostToDevice); cudaMemcpy(d_B, B, sizeof(double) * Width, cudaMemcpyHostToDevice); do_parallel_matmul<<>>(d_A, d_B, d_X, Width); cudaMemcpy(X, d_X, sizeof(double) * Width, cudaMemcpyDeviceToHost); finish […]

将全局复制到共享内存的最佳方法

假设我有一个32个线程的块需要随机访问1024个元素数组。 我想通过最初将块从全局传输到共享来减少全局内存调用的数量。 我有两个想法: A: my_kernel() { CopyFromGlobalToShared(1024 / 32 elements); UseSharedMemory(); } 或B: my_kernel() { if (first thread in block) { CopyFromGlobalToShared(all elements); } UseSharedMemory(); } 哪个更好? 还是有另一种更好的方法吗?