你好,我是 CUDA 编程新手。我通过使用 OpenCL 构建程序获得了这段汇编代码。
我开始想知道这些数字和字符意味着什么。如%f7、%f11、%rd3、%r3、%f、%p。
我猜这rd
可能指的是寄存器?数字是寄存器号?也许百分比只是将操作数写入 ptx 命令的一种方式(即 ld.shared.f32)?如果我的猜测是正确的,那么 %r3 是什么意思,它就像不同类别的寄存器吗?还有 %p 和 %f7。
先感谢您。
ld.global.f32 %f7, [%rd16];
st.shared.f32 [%rd2], %f7;
bar.sync 0;
ld.shared.f32 %f8, [%rd4];
ld.shared.f32 %f9, [%rd3];
fma.rn.f32 %f10, %f9, %f8, %f32;
ld.shared.f32 %f11, [%rd4+32];
ld.shared.f32 %f12, [%rd3+4];
fma.rn.f32 %f13, %f12, %f11, %f10;
ld.shared.f32 %f14, [%rd4+64];
ld.shared.f32 %f15, [%rd3+8];
fma.rn.f32 %f16, %f15, %f14, %f13;
ld.shared.f32 %f17, [%rd4+96];
ld.shared.f32 %f18, [%rd3+12];
fma.rn.f32 %f19, %f18, %f17, %f16;
ld.shared.f32 %f20, [%rd4+128];
ld.shared.f32 %f21, [%rd3+16];
fma.rn.f32 %f22, %f21, %f20, …
Run Code Online (Sandbox Code Playgroud) 正如这里所说,OpenCV 使用 IPP,而 IPP 使用 GPU:
\n\n\n\n\n原来 OpenCV 正在使用 IPP,而 IPP 本身现在也可以使用 GPU\n。
\n\n以防万一其他人在 google 上搜索“opencv gpu 速度较慢”并且不知道\n IPP GPU 支持;)
\n
另外,我发现了这个:
\n\n\n\n\n使用Intel\xc2\xae IPP异步优化增强现实管道
\n\n使用 Intel\xc2\xae GPU优化 Total Immersion 的 D\'Fusion* 增强现实管道的性能和功耗
\n
而且没有一个关键字:OpenCL、OpenACC、CUDA、nVidia,...
\n\n与GPU相关的关键字只有一个:OpenGL
\n\n这是否意味着Intel IPP仅支持Intel GPU?或者 Intel IPP 支持任何支持 OpenGL 的 GPU(nVidia GeForce、AMD Radeon)?
\n我想生成一个随机数,哈希,与SHA256
我的GPU使用OpenCL
与此基本代码(而不是散列那些预先给定的纯文本,它散列随机数)。
我让所有的散列都在我的 GPU 上工作,但有一个问题:
使用 OpenCL 时,每秒完成的散列数量会降低吗?
是的,您没听错,目前仅使用 CPU 比仅使用 GPU 更快。
我的 GPU 仅~10%
在我的 CPU 运行时运行~100%
我的问题是:这怎么可能,更重要的是,我该如何解决?
这是我用于生成 a 的代码Pseudo-Random Number
(在两次运行之间根本不会改变):
long Miner::Rand() {
std::mt19937 rng;
// initialize the random number generator with time-dependent seed
uint64_t timeSeed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
std::seed_seq ss{ uint32_t(timeSeed & 0xffffffff), uint32_t(timeSeed >> 32) };
rng.seed(ss);
// initialize a uniform distribution between 0 and 1
std::uniform_real_distribution<double> unif(0, 1);
double rnd = unif(rng);
return floor(99999999 * …
Run Code Online (Sandbox Code Playgroud) 我们有数百万个小文件要由某些程序处理。
精确的计划并不重要,变化也与精确的任务。然而,这些是较小的 C++ 程序,我们有源代码,但它们本质上是不可并行的。
使用单个平均 CPU 内核(Intel i7 系列)时,处理一个小文件大约需要 15 秒。并且在程序运行时它需要大约 200 MB 的 RAM。
我们希望在 GPU 上并行化,并在每个 GPU 核心(例如 Cuda 核心)上运行一个程序实例。因此,如果 GPU 有 3000 个 CUDA 核心,那么我们希望并行运行 3000 个实例。如果可能,我们希望使用像 OpenCL 这样的通用框架(而不是 Cuda,但如果在这种情况下需要 Cuda,那将是可以接受的)。
现在我们正在尝试评估这是否可行(我们在 GPGPU 编程方面还没有太多经验)。我们想象的主要问题是记忆。如果我们并行运行 3000 个实例,每个实例需要 200 MB VRAM,那么我们需要 600 GB 内存。
我们主要考虑的显卡是高端 Geforce 卡,通常具有 8 GB 到 11 GB 的内存。我们有每个机箱/主板有 4 个卡的 GPU 工作站,我们一开始想用它(但后来也可能在其他 GPU 系统上,因此我们更喜欢像 OpenCL 这样的通用框架)。
有哪些方法可以解决这个问题?
我必须将压缩列存储中的稀疏矩阵与列向量相乘(我必须在开放式cl中并行化它)。我在互联网上进行了搜索。花了很多天但找不到任何东西。(我被允许搜索互联网因为我必须将其转换为并行)。但我只能找到压缩行存储的代码。
spmv_csr_serial(const int num_rows ,
const int * ptr ,
const int * indices ,
const float * data ,
const float * x,
float * y)
{
for(int row = 0; i < num_rows; i++){
float dot = 0;
int row_start = ptr[row];
int row_end = ptr[row+1];
for (int jj = row_start; jj < row_end; jj++)
dot += data[jj] * x[indices[jj]];
y[row] += dot;
}
}
Run Code Online (Sandbox Code Playgroud)
压缩列存储没有行指针。那么如何将它与向量相乘呢?我只需要串行代码,然后我自己将其转换为并行代码。
这是我用于该项目的 OpenCL 内核
enter code here
__kernel void mykernel(__global const int* val,__global …
Run Code Online (Sandbox Code Playgroud) 我正在制作一个小型Java游戏库,我想制作更多面向Java的绘图的绘图代码,而不是调用一些C++方法来绘制API.无论如何,我担心它可能比其他图形API慢.那么这将是一个不错的选择吗?另一个问题是我找不到有用的OpenCL教程(我需要先学习它),有人知道吗?
我尝试在GPU代码(OpenCL/C++内核)中执行系统命令
system("ngspice");
Run Code Online (Sandbox Code Playgroud)
但是我收到了这条ERROR消息:CL_INVALID_BINARY.
我发现一些问题,说它不允许在内核中调用外部函数!
OPENCL: OpenCL - 是否可以从内核中调用另一个函数?
CUDA: 不支持CUDA外部呼叫
如果我没错,那是OPENCL/CUDA限制之一:
OpenCL:https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/restrictions.html
CUDA:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#functions
我对吗?这种限制背后的原因是什么?
如何使这个函数的for循环使用GPU与OpenCL?
public static double[] Calculate(double[] num, int period)
{
var final = new double[num.Length];
double sum = num[0];
double coeff = 2.0 / (1.0 + period);
for (int i = 0; i < num.Length; i++)
{
sum += coeff * (num[i] - sum);
final[i] = sum;
}
return final;
}
Run Code Online (Sandbox Code Playgroud)