- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在debug模式下程序运行良好,但在Release模式下memcpy操作出现错误
CellBot *hCellList;
CellBot *dCellList;
size_t CellSize = WorldConst.numberOfCells * sizeof(CellBot);
assert(!((hCellList = (CellBot *)malloc(CellSize)) == NULL));
gpuAssert(cudaMalloc((void**)&dCellList, CellSize));
::memcpy(hCellList, CellList.data(), CellSize);
gpuAssert(cudaMemcpy(dCellList, hCellList, CellSize, cudaMemcpyHostToDevice));
对此没有任何想法。我总是在 Debug模式下工作,当决定发布时会出现这样的错误。程序停止在这行代码上:
::memcpy(hCellList, CellList.data(), CellSize);
OgreCu_0.01.exe 中的 0x00007FFB9820C447 (vcruntime140.dll) 抛出异常:0xC0000005:访问冲突写入位置 0x0000000000000000。
Visual Studio 在 memcpy.asm 中显示错误线标记**
CopyUp:
cmp r8, 128
jbe XmmCopySmall
bt __favor, __FAVOR_ENFSTRG ; check for ENFSTRG (enhanced fast strings)
jnc XmmCopyUp ; If Enhanced Fast String not available, use XMM
; use Enhanced Fast Strings
; but first align the destination dst to 16 byte alignment
mov rax, r11 ; return original destination pointer
mov r11, rdi ; save rdi in r11
mov rdi, rcx ; move destination pointer to rdi
mov rcx, r8 ; move length to rcx
mov r8, rsi ; save rsi in r8
mov rsi, r10 ; move source pointer to rsi
**rep movsb ; copy source to destination buffer**
mov rsi, r8 ; restore rsi
mov rdi, r11 ; restore rdi
ret
我改变::memcpy(hCellList, CellList.data(), CellSize);
至
for (int e = 0; e < WorldConst.numberOfCells; e++)
{
hCellList[e] = CellList[e];
}
hCellList[e] = CellList[e];
中出现同样的错误
CellBot的结构
struct CellBot
{
int mainId;
int subId;
Vec3 coord;
Vec3 speed;
Vec3 nspeed;
Vec3 velocity;
Vec3 nvelocity;
float radiusView;
float radiusAttraction;
float radiusRepulsion;
float forceAttraction;
float forceRepulsion;
float radius;
float mass;
float frictionBounce;
int colorId;
int groupId;
};
Vec3:
template <typename T=float>
class XVector3
{
public:
typedef T value_type;
__host__ __device__ inline XVector3() : x(0.0f), y(0.0f), z(0.0f) {}
__host__ __device__ inline XVector3(T a) : x(a), y(a), z(a) {}
__host__ __device__ inline XVector3(const T* p) : x(p[0]), y(p[1]), z(p[2]) {}
__host__ __device__ inline XVector3(T x_, T y_, T z_) : x(x_), y(y_), z(z_)
{
VEC3_VALIDATE();
}
__host__ __device__ inline operator T* () { return &x; }
__host__ __device__ inline operator const T* () const { return &x; };
__host__ __device__ inline void Set(T x_, T y_, T z_) { VEC3_VALIDATE(); x = x_; y = y_; z = z_;}
__host__ __device__ inline XVector3<T> operator * (T scale) const { XVector3<T> r(*this); r *= scale; return r; VEC3_VALIDATE();}
__host__ __device__ inline XVector3<T> operator / (T scale) const { XVector3<T> r(*this); r /= scale; return r; VEC3_VALIDATE();}
__host__ __device__ inline XVector3<T> operator + (const XVector3<T>& v) const { XVector3<T> r(*this); r += v; return r; VEC3_VALIDATE();}
__host__ __device__ inline XVector3<T> operator - (const XVector3<T>& v) const { XVector3<T> r(*this); r -= v; return r; VEC3_VALIDATE();}
__host__ __device__ inline XVector3<T> operator /(const XVector3<T>& v) const { XVector3<T> r(*this); r /= v; return r; VEC3_VALIDATE();}
__host__ __device__ inline XVector3<T> operator *(const XVector3<T>& v) const { XVector3<T> r(*this); r *= v; return r; VEC3_VALIDATE();}
__host__ __device__ inline XVector3<T>& operator *=(T scale) {x *= scale; y *= scale; z*= scale; VEC3_VALIDATE(); return *this;}
__host__ __device__ inline XVector3<T>& operator /=(T scale) {T s(1.0f/scale); x *= s; y *= s; z *= s; VEC3_VALIDATE(); return *this;}
__host__ __device__ inline XVector3<T>& operator +=(const XVector3<T>& v) {x += v.x; y += v.y; z += v.z; VEC3_VALIDATE(); return *this;}
__host__ __device__ inline XVector3<T>& operator -=(const XVector3<T>& v) {x -= v.x; y -= v.y; z -= v.z; VEC3_VALIDATE(); return *this;}
__host__ __device__ inline XVector3<T>& operator /=(const XVector3<T>& v) {x /= v.x; y /= v.y; z /= v.z; VEC3_VALIDATE(); return *this; }
__host__ __device__ inline XVector3<T>& operator *=(const XVector3<T>& v) {x *= v.x; y *= v.y; z *= v.z; VEC3_VALIDATE(); return *this; }
__host__ __device__ inline bool operator != (const XVector3<T>& v) const { return (x != v.x || y != v.y || z != v.z); }
// negate
__host__ __device__ inline XVector3<T> operator -() const { VEC3_VALIDATE(); return XVector3<T>(-x, -y, -z); }
__host__ __device__ void Validate()
{
VEC3_VALIDATE();
}
T x,y,z;
};
typedef XVector3<float> Vec3;
typedef XVector3<float> Vector3;
// lhs scalar scale
template <typename T>
__host__ __device__ XVector3<T> operator *(T lhs, const XVector3<T>& rhs)
{
XVector3<T> r(rhs);
r *= lhs;
return r;
}
template <typename T>
__host__ __device__ bool operator==(const XVector3<T>& lhs, const XVector3<T>& rhs)
{
return (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z);
}
最佳答案
很难理解你的问题。请写出更完整的错误消息并解释您下次要做什么!
但是我的猜测是,您会遇到以下问题:assert
语句速度很慢,因此通常只能在 Debug模式下编译到代码中。在 Release模式下,它们通常被简单地忽略。
但是,在您的代码中,您在 assert
内使用了 malloc
。因此,在调试版本中,您可以获得所需的内存,而在发布版本中,您什么也得不到,并且程序崩溃。该行是:
assert(!((hCellList = (CellBot *)malloc(CellSize)) == NULL));
你应该做的是:
hCellList = (CellBot *)malloc(CellSize);
assert(!(hCellList == NULL));
关于c++ - 在 Debug模式下,所有程序运行良好,但在 Release模式下,我的 cudaMalloc 操作出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51560592/
我面临一个简单的问题,我对 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
我是一名优秀的程序员,十分优秀!