- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 cuda 的新手,正在尝试编写一些应该在球体上生成随机点的代码。这是代码。
__global__
void setup_kernel(curandStateMRG32k3a *state)
{
int id = threadIdx.x + blockIdx.x * blockDim.x;
curand_init(0, id, 0, &state[id]);
}
__global__
void computeRandomVectors(float* x, float* y, float* z, unsigned int numberOfElements,curandStateMRG32k3a *state)
{
float a,b;
unsigned int i = blockDim.x * blockIdx.x + threadIdx.x;
curandStateMRG32k3a localState = state[i];
if(i < numberOfElements)
{
a = curand_uniform(&localState);
b = curand_uniform(&localState);
while(a * a + b * b > 1.0f)
{
a = curand_uniform(&localState) * 2.0f - 1.0f;
b = curand_uniform(&localState) * 2.0f - 1.0f;
}
x[i] = 2.0f * a * sqrtf(1.0f - a * a - b * b);
y[i] = 2.0f * b * sqrtf(1.0f - a * a - b * b);
z[i] = 1.0f - 2.0f * (a * a + b * b);
}
}
void generatePointsOnASphere(thrust::host_vector<float>& h_x, thrust::host_vector<float>& h_y, thrust::host_vector<float>& h_z)
{
if(h_x.size() != h_y.size() && h_x.size() != h_z.size())
{
std::cout << "The three component vectors have unmatching size()" << std::endl;
return;
}
size_t size = h_x.size() * sizeof(float);
float* h_p_x = (float*) calloc(h_x.size(),sizeof(float));
float* h_p_y = (float*) calloc(h_x.size(),sizeof(float));
float* h_p_z = (float*) calloc(h_x.size(),sizeof(float));
if(h_p_x==NULL || h_p_y==NULL || h_p_z==NULL)
{
std::cout << "Host memory allocation failure" << std::endl;
return;
}
float* d_p_x;
float* d_p_y;
float* d_p_z;
if(cudaMalloc((void **)&d_p_x,size) != cudaSuccess ||
cudaMalloc((void **)&d_p_y,size) != cudaSuccess ||
cudaMalloc((void **)&d_p_z,size) != cudaSuccess)
{
std::string errorString(cudaGetErrorName(cudaGetLastError()));
std::cout << errorString << std::endl;
std::cout << "Device memory allocation failure" << std::endl;
return;
}
curandStateMRG32k3a *devStates;
if(cudaMalloc((void **)&devStates, h_x.size() * sizeof(curandStateMRG32k3a)) != cudaSuccess)
{
std::string errorString(cudaGetErrorName(cudaGetLastError()));
std::cout << errorString << std::endl;
std::cout << "Random generator states memory allocation failure" << std::endl;
return;
}
int threads = 256;
dim3 grid = size / threads;
setup_kernel<<<grid,threads>>>(devStates);
if(cudaMemcpy(d_p_x,h_p_x,size,cudaMemcpyHostToDevice) != cudaSuccess ||
cudaMemcpy(d_p_y,h_p_y,size,cudaMemcpyHostToDevice) != cudaSuccess ||
cudaMemcpy(d_p_z,h_p_z,size,cudaMemcpyHostToDevice) != cudaSuccess)
{
std::string errorString(cudaGetErrorName(cudaGetLastError()));
std::cout << errorString << std::endl;
std::cout << "Host to Device memory copy failure" << std::endl;
}
computeRandomVectors<<< grid, threads >>>(d_p_x,d_p_y,d_p_z,size / sizeof(float), devStates);
if(cudaMemcpy(h_p_x,d_p_x,size,cudaMemcpyDeviceToHost) != cudaSuccess ||
cudaMemcpy(h_p_y,d_p_y,size,cudaMemcpyDeviceToHost) != cudaSuccess ||
cudaMemcpy(h_p_z,d_p_z,size,cudaMemcpyDeviceToHost) != cudaSuccess)
{
std::string errorString(cudaGetErrorName(cudaGetLastError()));
std::cout << errorString << std::endl;
std::cout << "Device to Host memory copy failure" << std::endl;
}
for(size_t i = 0; i < h_x.size(); ++i)
{
h_x[i] = h_p_x[i];
h_y[i] = h_p_y[i];
h_z[i] = h_p_z[i];
}
free (h_p_x);
free (h_p_y);
free (h_p_z);
cudaFree (devStates);
cudaFree (d_p_x);
cudaFree (d_p_y);
cudaFree (d_p_z);
cudaDeviceReset();
}
如果 vector 中的元素数量少于 4000(我尝试了 1K、2K、3K 和 4K),则此代码有效。比它在第一个 cudaMemcpy 中给我 cuda Error Illegal Address。我认为我没有用完内存,我正在使用 gtx 980(4GB 全局内存)。知道如何解决这个问题吗?
编辑:建议修改后的代码如下:
__global__
void setup_kernel(curandStateMRG32k3a *state, unsigned int numberOfElements)
{
int id = threadIdx.x + blockIdx.x * blockDim.x;
if(id < numberOfElements) curand_init(0, id, 0, &state[id]);
}
__global__
void computeRandomVectors(float* x, float* y, float* z, unsigned int numberOfElements,curandStateMRG32k3a *state)
{
float a,b;
unsigned int i = blockDim.x * blockIdx.x + threadIdx.x;
curandStateMRG32k3a localState = state[i];
if(i < numberOfElements)
{
a = curand_uniform(&localState);
b = curand_uniform(&localState);
while(a * a + b * b > 1.0f)
{
a = curand_uniform(&localState) * 2.0f - 1.0f;
b = curand_uniform(&localState) * 2.0f - 1.0f;
}
x[i] = 2.0f * a * sqrtf(1.0f - a * a - b * b);
y[i] = 2.0f * b * sqrtf(1.0f - a * a - b * b);
z[i] = 1.0f - 2.0f * (a * a + b * b);
}
}
void generatePointsOnASphere(thrust::host_vector<float>& h_x, thrust::host_vector<float>& h_y, thrust::host_vector<float>& h_z)
{
if(h_x.size() != h_y.size() && h_x.size() != h_z.size())
{
std::cout << "The three component vectors have unmatching size()" << std::endl;
return;
}
size_t size = h_x.size() * sizeof(float);
float* h_p_x = (float*) calloc(h_x.size(),sizeof(float));
float* h_p_y = (float*) calloc(h_x.size(),sizeof(float));
float* h_p_z = (float*) calloc(h_x.size(),sizeof(float));
if(h_p_x==NULL || h_p_y==NULL || h_p_z==NULL)
{
std::cout << "Host memory allocation failure" << std::endl;
return;
}
float* d_p_x;
float* d_p_y;
float* d_p_z;
if(cudaMalloc((void **)&d_p_x,size) != cudaSuccess ||
cudaMalloc((void **)&d_p_y,size) != cudaSuccess ||
cudaMalloc((void **)&d_p_z,size) != cudaSuccess)
{
std::string errorString(cudaGetErrorName(cudaGetLastError()));
std::cout << errorString << std::endl;
std::cout << "Device memory allocation failure" << std::endl;
return;
}
curandStateMRG32k3a *devStates;
if(cudaMalloc((void **)&devStates, h_x.size() * sizeof(curandStateMRG32k3a)) != cudaSuccess)
{
std::string errorString(cudaGetErrorName(cudaGetLastError()));
std::cout << errorString << std::endl;
std::cout << "Random generator states memory allocation failure" << std::endl;
return;
}
if(cudaMemcpy(d_p_x,h_p_x,size,cudaMemcpyHostToDevice) != cudaSuccess ||
cudaMemcpy(d_p_y,h_p_y,size,cudaMemcpyHostToDevice) != cudaSuccess ||
cudaMemcpy(d_p_z,h_p_z,size,cudaMemcpyHostToDevice) != cudaSuccess)
{
std::string errorString(cudaGetErrorName(cudaGetLastError()));
std::cout << errorString << std::endl;
std::cout << "Host to Device memory copy failure" << std::endl;
}
int threads = 512;
dim3 grid = (h_x.size() + threads - 1) / threads;
setup_kernel<<<grid,threads>>>(devStates, size / sizeof(float));
computeRandomVectors<<< grid, threads >>>(d_p_x,d_p_y,d_p_z,size / sizeof(float), devStates);
cudaDeviceSynchronize();
if(cudaMemcpy(h_p_x,d_p_x,size,cudaMemcpyDeviceToHost) != cudaSuccess ||
cudaMemcpy(h_p_y,d_p_y,size,cudaMemcpyDeviceToHost) != cudaSuccess ||
cudaMemcpy(h_p_z,d_p_z,size,cudaMemcpyDeviceToHost) != cudaSuccess)
{
std::string errorString(cudaGetErrorName(cudaGetLastError()));
std::cout << errorString << std::endl;
std::cout << "Device to Host memory copy failure" << std::endl;
}
for(size_t i = 0; i < h_x.size(); ++i)
{
h_x[i] = h_p_x[i];
h_y[i] = h_p_y[i];
h_z[i] = h_p_z[i];
}
free (h_p_x);
free (h_p_y);
free (h_p_z);
cudaFree (devStates);
cudaFree (d_p_x);
cudaFree (d_p_y);
cudaFree (d_p_z);
cudaDeviceReset();
}
我为继续在这里发帖感到抱歉,但我认为通过了解我现在的错误,我想我可能会更好地了解 cuda。所以,现在当 h_x.size() 为 20k 时,我在 cudaMemcpy device->host 上收到 errorIllegalAdress。我仍然不明白代码如何适用于小数字而不适用于大数字。
最佳答案
问题出在这里:
size_t size = h_x.size() * sizeof(float);
...
int threads = 256;
dim3 grid = size / threads;
您的size
变量按字节 的数量缩放。所以这不是用于网格大小的正确变量。您应该像这样计算网格大小:
dim3 grid = h_x.size() / threads;
或类似的。另请注意,此构造不会正确初始化所有 curand 状态,除非 vector 长度 (h_x.size()
) 可被 threads
整除,即 256。这将在您的 setup_kernel
中包含线程检查,类似于您的其他内核中的线程检查:
__global__
void setup_kernel(curandStateMRG32k3a *state, int size)
{
int id = threadIdx.x + blockIdx.x * blockDim.x;
if (id < size)
curand_init(0, id, 0, &state[id]);
}
并启动足够多的线程来覆盖 vector 大小:
dim3 grid = (h_x.size()+threads-1) / threads;
关于c++ - cudaMemcpy 上的 cudaErrorIllegalAdress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36508747/
下面是一小段代码,将数组中的 4 个元素复制到 GPU。我真的不明白为什么 cudaMemcpy 在这种情况下会抛出错误。请帮忙 int size = 5; float *a = (float*)ma
我对我看到的关于阻塞和 cudaMemcpy 的一些评论感到困惑。我的理解是 Fermi HW 可以同时执行内核和执行 cudaMemcpy。 我读到 Lib func cudaMemcpy() 是一
我的程序运行 2 个线程 - 线程 A(用于输入)和 B(用于处理)。我还有一对指向 2 个缓冲区的指针,这样当线程 A 完成将数据复制到缓冲区 1 时,线程 B 开始处理缓冲区 1,线程 A 开始将
之间有什么区别 cudaMemcpy and cudaMemset?? 如何将int值从主机复制到设备? 这是我正在使用的代码 int addXdir = 1; int devAddXdir; cu
我用 cudaMemcpy()一次将 1GB 的数据精确复制到设备。这需要 5.9 秒。反之则需要 5.1 秒。这是正常的吗?函数本身在复制之前有这么多开销吗? 理论上,PCIe 总线的吞吐量至少应为
在这种情况下,cudaMemcpy 函数将如何工作? 我已经声明了一个这样的矩阵 float imagen[par->N][par->M]; 我想将它复制到 cuda 设备,所以我这样做了 float
我正在尝试将无符号整数数组(在 msgs 中)复制到 GPU 上以对其进行处理,但以下代码不会复制任何内容。我在 cudaMemcpy 调用周围添加了一些 cuda 错误检查代码,并且得到以下信息:无
我根据本教程创建了一个简单但完整的程序:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory #i
我正在调用 cudaMemcpy 并且副本成功返回,但是源值没有被复制到目标。我使用 memcpy() 写了一篇类似的文章,效果很好。我在这里缺少什么? // host externs extern
我很好奇,当我们从主机复制到设备时,cudaMemcpy 是在 CPU 还是 GPU 上执行的? 换句话说,它是复制一个顺序过程还是并行完成? 让我解释一下我为什么这么问:我有一个包含 500 万个元
cudaMemcpy(dst, src, filesize, cudaMemcpyDeviceToHost); 其中filesize是存储在设备全局内存中的变量。 最佳答案 简单的答案是否定的。 参数
我试图找出为什么 cudaMemcpyFromSymbol() 存在。似乎“symbol” func 可以做的所有事情,nonSymbol cmd 也可以做。 symbol 函数似乎可以轻松移动数组或
我刚刚开始学习如何使用 CUDA。我正在尝试运行一些简单的示例代码: float *ah, *bh, *ad, *bd; ah = (float *)malloc(sizeof(float)*4);
cudaMemcpy(dst, src, filesize, cudaMemcpyDeviceToHost); 其中 filesize 是存储在设备全局内存中的变量。 最佳答案 简单的回答是否定的。
这个错误困扰了我很长一段时间,所以我决定将其发布在这里。 调用 cudaMemcpy 时发生此段错误: CurrentGrid->cdata[i] = new float[size]; cudaMem
这个错误困扰了我很长一段时间,所以我决定将其发布在这里。 调用 cudaMemcpy 时发生此段错误: CurrentGrid->cdata[i] = new float[size]; cudaMem
这个错误困扰了我很长一段时间,所以我决定将其发布在这里。 调用 cudaMemcpy 时发生此段错误: CurrentGrid->cdata[i] = new float[size]; cudaMem
我无法追踪 cudaMemcpy 调用的无效参数的来源,以下是相关代码: 在 gpu_memory.cu 中,我为设备指针声明并分配内存: #define cudaErrorCheck(ans) {
我有一个带指针的数据结构(想想链表)。在启动读取输入数据的内核之前无法确定其大小。所以我在输入处理期间在设备上分配数据。 但是,尝试将该数据复制回主机失败。据我所知,这是因为 CUDA 中存在限制,不
在下面的代码中,cudaMemcpy 不工作,它返回一个错误,然后程序退出。可能是什么问题?在我看来我没有做违法的事情, vector 的大小对我来说似乎没问题。 算法可能在某些时候做错了,但我想这个
我是一名优秀的程序员,十分优秀!