- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
内存分配是 GPU 中最耗时的操作之一,因此我想通过使用以下代码调用一次 cudaMalloc
来分配 2 个数组:
int numElements = 50000;
size_t size = numElements * sizeof(float);
//declarations-initializations
float *d_M = NULL;
err = cudaMalloc((void **)&d_M, 2*size);
//error checking
// Allocate the device input vector A
float *d_A = d_M;
// Allocate the device input vector B
float *d_B = d_M + size;
err = cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
//error checking
err = cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
//error checking
原始代码位于名为 vectorAdd.cu 的 cuda 工具包的示例文件夹中,因此您可以假设 h_A、h_B 已正确启动并且代码无需我进行的修改即可工作。
结果是第二个 cudaMemcpy 返回错误消息 invalid argument。
似乎操作“d_M + size”没有返回人们期望的结果,因为设备内存的行为不同但我不知道如何。
我的方法(调用一次 cudaMalloc 为两个数组分配内存)是否可行?也欢迎任何关于这是否是一个好方法的评论/回答。
更新
作为Robert的答案和 dreamcrash建议我必须将元素数 (numElements) 添加到指针 d_M 而不是字节数的大小。仅供引用,没有明显的加速。
最佳答案
你只需要更换
float *d_B = d_M + size;
与
float *d_B = d_M + numElements;
这是指针运算,如果你有一个 float 数组 R = [1.0,1.2,3.3,3.4]
你可以通过 printf("%f",*R);
。而第二个位置?您只需执行 printf("%f\n",*(++R));
从而 r[0] + 1
。您不像以前那样执行 r[0] + sizeof(float)
。当您执行 r[0] + sizeof(float)
时,您将访问位置 r[4]
中的元素,因为 size(float) = 4
.
当您声明 float *d_B = d_M + numElements;
时,编译器假定 d_b
将在内存中连续分配,并且每个元素的大小为 float
。因此,您不需要以字节为单位指定距离,而是以元素为单位,编译器将为您计算。这种方法更人性化,因为用元素表示指针运算比用字节表示更直观。此外,它也更便携,因为如果给定类型的字节数根据底层架构发生变化,编译器会为您处理。因此,一个人的代码不会因为假定一个固定的字节大小而中断。
你说“结果是第二个 cudaMemcpy 返回了一个错误消息无效参数”:
如果您打印与此错误对应的数字,它将打印 11
并且如果您检查 CUDA API您确认此错误对应于:
cudaErrorInvalidValue
This indicates that one or more of the parameters passed to the APIcall is not within an acceptable range of values.
在您的示例中意味着 float *d_B = d_M + size;
超出了范围。
您已经为 100000
float 分配了空间,d_a
将从 0 开始到 50000,但是根据您的代码 d_b
将从 numElements * sizeof(float);
50000 * 4 = 200000,因为 200000 > 100000 你得到的是无效参数。
关于c++ - 分配两个数组一次调用 cudaMalloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13685468/
我面临一个简单的问题,我对 cudaMalloc 的所有调用都失败了,给我一个内存不足错误,即使它只是我分配的一个字节。 cuda 设备可用,并且还有大量可用内存(机器人通过相应的调用进行检查)。 知
我知道 cudaMemcpy 会同步主机和设备,但是 cudaMalloc 或 cudaFree 怎么样? 基本上我想在多个 GPU 设备上异步内存分配/复制和内核执行,我的代码的简化版本是这样的:
我正在尝试使用 cudaMalloc 在 GPU 上分配大量内存:cudaMalloc((void**)&count_d, N*sizeof(long));与 unsigned long N = 99
或者,如果我想确保数组包含全0,是否需要执行cudaMemset()?我在文档中找不到它。 谢谢。 最佳答案 cudaMalloc documentation说: Allocates size byt
我正在尝试修改 CUDA SDK 中的 imageDenosing 类,我需要多次重复过滤器以捕捉时间。但是我的代码不能正常工作。 //开始 __global__ void F1D(TColor *i
我在其他地方读到 cudaMalloc 将跨内核同步。 (例如 will cudaMalloc synchronize host and device? ) 但是,我刚刚测试了这段代码,并根据我在可视
template void gpu_load(T (&data)[N]) { cudaMalloc((void**)data, N*sizeof(T)); } 我这样调用它: float d
我正在尝试将二维矩阵从主机复制到设备。这是我写的 int dev=0; cudaSetDevice(dev); uint16_t * dev_matrix; size_
我正在编写代码,使用 cuSparse 在 GPU 上对数千个稀疏矩阵进行计算。由于 GPU 上的内存有限,我需要一个一个地处理它们,因为剩余的内存被其他 GPU 变量和密集矩阵占用。 我的工作流程(
谁能帮我理解为什么下面的代码会导致段错误?同样,谁能帮助我理解为什么将标记为“坏”的两条线换成标记为“好”的两条线不会导致段错误? 请注意,段错误似乎发生在 cudaMalloc 行;如果我评论出来,
我有一个简单的基于粒子的刚体动力学代码,每个刚体由许多具有质量、位置、速度等的小粒子组成......现在我想将这个 cpu 代码移植到 gpu。 对于结构,我选择使用指针数组 int** d_rigi
内存分配是 GPU 中最耗时的操作之一,因此我想通过使用以下代码调用一次 cudaMalloc 来分配 2 个数组: int numElements = 50000; size_t size = nu
我想让在 CUDA5.0 中将内容从主机复制到设备更加方便。所以我想创建一个函数,将主 vector 作为参数并返回如下结构: template struct devArr { unsign
我已经开始编写一个新的 CUDA 应用程序。然而,我一路上绕了一个有趣的弯路。在变量 x 上调用第一个 cudaMalloc,第一次失败。但是,当我第二次调用它时,它返回 cudaSuccess。最近
我正在尝试找出程序中的错误。它产生 [vaio:10404] Signal: Segmentation fault (11) [vaio:10404] Signal code: Address not
我有一台内存为 2Gb 的 GTX570,当我尝试通过一次 cudamalloc 调用分配超过 804Mb 的内存时,我遇到了麻烦。任何人对为什么会这样有任何想法吗?这是我的第一个电话,所以我怀疑它是
以下代码广泛用于GPU全局内存分配: float *M; cudaMalloc((void**)&M,size); 我想知道为什么我们必须将指针传递给 cudaMalloc,以及为什么它的设计不是这样
我正在为 MATLAB 编写一个 mexFunction,并且我已经让 CUDA MEX 功能与 MATLAB 示例一起运行,没有任何问题。 下面是一个简单的“将数据加载到设备”脚本。它返回 3 条消
这里确实有效,所以我想知道 cuda 是否在线程中动态分配设备上的内存?如果是这样,__device__ malloc 有什么用,因为相比之下这要快得多?我想问的是当您在内核中使用 cudaMallo
我下载了 NVIDIA Computing Toolkit(包含 CUDA 9.0 SDK)。在 SDK 中,有一个名为 cppIntegration 的 Visual Studio 项目。 在cpp
我是一名优秀的程序员,十分优秀!