我正在使用Qt创建器构建一个简单的应用程序,其中我想利用CPU和GPU计算来完成任务,然后以m/s比较执行时间.
我已阅读了大量文章并得出结论,我需要将NVCC和GCC编译器彼此分开以避免冲突.我按照本教程,对我的系统进行了调整,但是当我编译时出现了一个奇怪的错误:
sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
make: *** [gaussian_cuda.o] Error 1
14:42:46: The process "/usr/bin/make" exited with code 2.
Run Code Online (Sandbox Code Playgroud)
在我的.pro
配置中,错误显然是从这一行抛出的:
2>&1 | sed -r \"s/\\(([0-9]+)\\)/:\\1/g\" 1>&2
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这是一个非法操作,当我尝试删除此行时,我的代码完全中断.
为什么是r
非法操作?
编辑完整的配置代码:
QT += core gui
QT += multimedia
QT += multimediawidgets
QT += concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = WebcamFilter
TEMPLATE = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用cuSOLVER库实现Cholesky分解。我是一名初学者CUDA程序员,并且我一直指定块大小和网格大小,但是我无法找出程序员如何使用cuSOLVER函数显式设置它。
这是文档:http : //docs.nvidia.com/cuda/cusolver/index.html#introduction
QR分解是使用cuSOLVER库实现的(请参见此处的示例:http ://docs.nvidia.com/cuda/cusolver/index.html#ormqr-example1 ),即使在此处也未设置上述两个参数。
总结一下,我有以下问题
我试图从主机ubuntu机器上运行远程Ubuntu机器上的CUDA粒子样本.我遵循了这个教程:http: //devblogs.nvidia.com/parallelforall/remote-application-development-nvidia-nsight-eclipse-edition/它在我的主机上运行,但不在我的远程机器上运行.
我在Nsight中得到以下输出:
CUDA Particles Simulation Starting...
grid: 64 x 64 x 64 = 262144 cells
particles: 16384
No protocol specified
freeglut (/users/path/particles/Debug/particles): failed to open display ':0'
logout
Run Code Online (Sandbox Code Playgroud)
如果我从终端运行程序,我得到:
CUDA Particles Simulation Starting...
grid: 64 x 64 x 64 = 262144 cells
particles: 16384
CUDA error at ../src/particleSystem_cuda.cu:85 code=79(cudaErrorInvalidGraphicsContext) "cudaGraphicsGLRegisterBuffer(cuda_vbo_resource, vbo, cudaGraphicsMapFlagsNone)"
Run Code Online (Sandbox Code Playgroud)
是否可以在我的主机上显示粒子模拟,而计算是在远程系统上进行的?
它是通过X11Forwarding实现的,还是完全不同的错误?
我正在将一些代码从一台电脑上的 VS2017 移动到另一台装有 VS2019 的电脑。一切都很好,除了我不能使用 std::filesystem 。在我以前的代码中,我使用 C++14 并拥有 std::experimental::filesystem。在新代码中,我想迁移到 C++17,因此我更改为 std::filesystem (如下面的代码所示)。奇怪的是,智能感知(不确定它是正确的名称)没有显示错误。当我输入 std::f 时它甚至会显示文件系统...
但代码不会构建并给出错误“命名空间“std”没有成员“文件系统””。
我将C++语言标准更改为c++latest,VS2019版本是Community 16.6.5。
#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
std::string path = "C:\\";
for (const auto& entry : fs::directory_iterator(path))
std::cout << entry.path() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我最初的问题的最后一行可能不够清楚:我已经将“C++ 语言标准”更改为 C++17 或 C++latest。
感谢@drescherjm,我们发现这是一个 Cuda 问题。Cuda 专家有什么想法吗?
我在并发CUDA时遇到了一些麻烦.看一下附图.内核在标记点启动,时间为0.395秒.然后有一些绿色的CpuWork.最后,调用cudaDeviceSynchronize.在CpuWork之前启动的内核在同步调用之前没有启动.理想情况下,它应该与CPU工作并行运行.
void KdTreeGpu::traceRaysOnGpuAsync(int firstRayIndex, int numRays, int rank, int buffer)
{
int per_block = 128;
int num_blocks = numRays/per_block + (numRays%per_block==0?0:1);
Ray* rays = &this->deviceRayPtr[firstRayIndex];
int* outputHitPanelIds = &this->deviceHitPanelIdPtr[firstRayIndex];
kdTreeTraversal<<<num_blocks, per_block, 0>>>(sceneBoundingBox, rays, deviceNodesPtr, deviceTrianglesListPtr,
firstRayIndex, numRays, rank, rootNodeIndex,
deviceTHitPtr, outputHitPanelIds, deviceReflectionPtr);
CUDA_VALIDATE(cudaMemcpyAsync(resultHitDistances[buffer], deviceTHitPtr, numRays*sizeof(double), cudaMemcpyDeviceToHost));
CUDA_VALIDATE(cudaMemcpyAsync(resultHitPanelIds[buffer], outputHitPanelIds, numRays*sizeof(int), cudaMemcpyDeviceToHost));
CUDA_VALIDATE(cudaMemcpyAsync(resultReflections[buffer], deviceReflectionPtr, numRays*sizeof(Vector3), cudaMemcpyDeviceToHost));
}
Run Code Online (Sandbox Code Playgroud)
memcopies是异步的.结果缓冲区就像这样分配
unsigned int flag = cudaHostAllocPortable;
CUDA_VALIDATE(cudaHostAlloc(&resultHitPanelIds[0], MAX_RAYS_PER_ITERATION*sizeof(int), flag));
CUDA_VALIDATE(cudaHostAlloc(&resultHitPanelIds[1], MAX_RAYS_PER_ITERATION*sizeof(int), flag));
Run Code Online (Sandbox Code Playgroud)
希望找到解决方案.尝试了很多东西,包括没有在默认流中运行.当我添加cudaHostAlloc时,我发现异步方法返回到CPU.但是,如果内核在稍后调用deviceSynchronize之前未启动,那么这没有任何帮助.
resultHitDistances[2]
包含两个已分配的内存区域,以便当CPU读取0时,GPU应将结果置于1.
谢谢!
编辑:这是调用traceRaysAsync的代码.
int numIterations = ceil(float(this->numPrimaryRays) / MAX_RAYS_PER_ITERATION);
int numRaysPrevious …
Run Code Online (Sandbox Code Playgroud) 我正在使用Capabilities 3.5,CUDA 5和VS 2010(显然是Windows).
我有兴趣阅读已编译的代码,以更好地理解我的C代码更改的含义.
我对CUDA编程有问题!输入是矩阵A(2 x 2),输出是矩阵A(2 x 2),每个新值都是**旧值的3指数**示例:输入:A:{2,2}输出:A { 8,8} {2,2} {8,8}
我在CudaCode.CU文件中有2个功能:
__global__ void Power_of_02(int &a)
{
a=a*a;
}
//***************
__global__ void Power_of_03(int &a)
{
int tempt = a;
Power_of_02(a); //a=a^2;
a= a*tempt; // a = a^3
}
Run Code Online (Sandbox Code Playgroud)
和内核:
__global__ void CudaProcessingKernel(int *dataA ) //kernel function
{
int bx = blockIdx.x;
int tx = threadIdx.x;
int tid = bx * XTHREADS + tx;
if(tid < 16)
{
Power_of_03(dataA[tid]);
}
__syncthreads();
}
Run Code Online (Sandbox Code Playgroud)
我认为是正确的,但是会出现错误:仅在compute_35或更高版本的体系结构上允许从__global__函数(“ Power_of_03”)调用__global__函数(“ Power_of_02”)
为什么我错了?怎么修呢?
考虑以下数据集和质心。有 7 个个体和两个均值,每个均具有 8 个维度。它们存储在行主序中。
short dim = 8;
float centroids[] = {
0.223, 0.002, 0.223, 0.412, 0.334, 0.532, 0.244, 0.612,
0.742, 0.812, 0.817, 0.353, 0.325, 0.452, 0.837, 0.441
};
float data[] = {
0.314, 0.504, 0.030, 0.215, 0.647, 0.045, 0.443, 0.325,
0.731, 0.354, 0.696, 0.604, 0.954, 0.673, 0.625, 0.744,
0.615, 0.936, 0.045, 0.779, 0.169, 0.589, 0.303, 0.869,
0.275, 0.406, 0.003, 0.763, 0.471, 0.748, 0.230, 0.769,
0.903, 0.489, 0.135, 0.599, 0.094, 0.088, 0.272, 0.719,
0.112, 0.448, 0.809, 0.157, 0.227, 0.978, …
Run Code Online (Sandbox Code Playgroud) 我有一个 CUDA 卡,具有: Cuda 计算功能 (3.5) 如果我有一个诸如 <<<2000,512>>> 的调用,内核中发生的迭代次数是多少?我以为是(2000*512),但测试并不能证明这一点?我还想确认我计算变量的方式是正确的。
情况是,在内核中,我根据线程号递增传递的全局内存号:
int thr = blockDim.x * blockIdx.x + threadIdx.x;
worknumber = globalnumber + thr;
Run Code Online (Sandbox Code Playgroud)
因此,当我返回到 CPU 时,我想确切地知道有多少增量,以便我可以跟踪,这样当我调用内核 GPU 处理下一组数字时,我就不会重复或跳过数字。
编辑 :
__global__ void allin(uint64_t *lkey, const unsigned char *d_patfile)
{
uint64_t kkey;
int tmp;
int thr = blockDim.x * blockIdx.x + threadIdx.x;
kkey = *lkey + thr;
if (thr > tmp) {
tmp = thr;
printf("%u \n", thr);
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下CUDA核心,其中执行计算上昂贵的计算然后在两个操作中使用.
偶尔,我想myKernel
没有operationOne
.我知道代码分支通常是个坏主意,但是如果所有线程都运行相同的分支,那么仍然存在很大的低效率吗?即以下是一个坏主意?
__global__ void myKernel(bool doOpOne, ...) {
// usefulValue is computed
if(doOpOne) {
// perform operation one
}
// perform operation two
}
Run Code Online (Sandbox Code Playgroud)