- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道,为什么 NVCC 无法为小矩阵 (N=4) 展开以下 Cholesky 分解内核。
template<typename T, int N>
__device__ inline
void choleskyKernel2(T* C){
#pragma unroll
for (int i = 0; i < N; i++){
#pragma unroll
for (int j = 0; j <= i; j++) {
double s = 0;
#pragma unroll
for (int k = 0; k < j; k++){
s += C[i*N+k] * C[j*N+k];
}
s = C[i*N+j] - s;
C[i*N+j] = (i == j) ?
sqrt(s) :
(1.0 / C[j*N+j] * (s));
}
}
}
sqrt.rn.f64 %fd12, %fd29;
st.local.f64 [%rd1], %fd12;
rcp.rn.f64 %fd34, %fd12;
mul.f64 %fd13, %fd30, %fd34;
st.local.f64 [%rd1+32], %fd13;
fma.rn.f64 %fd35, %fd13, %fd13, 0d0000000000000000;
sub.f64 %fd36, %fd31, %fd35;
sqrt.rn.f64 %fd14, %fd36;
st.local.f64 [%rd1+40], %fd14;
mul.f64 %fd15, %fd32, %fd34;
st.local.f64 [%rd1+64], %fd15;
ld.local.f64 %fd37, [%rd1+32];
fma.rn.f64 %fd38, %fd15, %fd37, 0d0000000000000000;
sub.f64 %fd39, %fd33, %fd38;
rcp.rn.f64 %fd40, %fd14;
mul.f64 %fd16, %fd39, %fd40;
st.local.f64 [%rd1+72], %fd16;
mov.f64 %fd58, 0d0000000000000000;
mov.u32 %r58, -2;
mov.u64 %rd40, -8;
BB1_5:
shl.b64 %rd23, %rd40, 3;
sub.s64 %rd24, %rd1, %rd23;
ld.local.f64 %fd41, [%rd24];
fma.rn.f64 %fd58, %fd41, %fd41, %fd58;
add.s64 %rd40, %rd40, -1;
add.s32 %r58, %r58, 1;
setp.ne.s32 %p3, %r58, 0;
@%p3 bra BB1_5;
sub.f64 %fd43, %fd6, %fd58;
sqrt.rn.f64 %fd19, %fd43;
st.local.f64 [%rd1+80], %fd19;
mul.f64 %fd20, %fd8, %fd34;
st.local.f64 [%rd1+96], %fd20;
ld.local.f64 %fd45, [%rd1+32];
fma.rn.f64 %fd46, %fd20, %fd45, 0d0000000000000000;
sub.f64 %fd47, %fd9, %fd46;
mul.f64 %fd21, %fd47, %fd40;
st.local.f64 [%rd1+104], %fd21;
mov.f64 %fd59, 0d0000000000000000;
mov.u32 %r59, -2;
mov.u64 %rd41, %rd1;
BB1_7:
mov.u64 %rd5, %rd41;
ld.local.f64 %fd49, [%rd5+64];
ld.local.f64 %fd50, [%rd5+96];
fma.rn.f64 %fd59, %fd50, %fd49, %fd59;
add.s64 %rd6, %rd5, 8;
add.s32 %r59, %r59, 1;
setp.ne.s32 %p4, %r59, 0;
mov.u64 %rd41, %rd6;
@%p4 bra BB1_7;
sub.f64 %fd52, %fd10, %fd59;
rcp.rn.f64 %fd53, %fd19;
mul.f64 %fd24, %fd52, %fd53;
st.local.f64 [%rd1+112], %fd24;
mov.f64 %fd60, 0d0000000000000000;
mov.u32 %r60, -3;
mov.u64 %rd42, -12;
BB1_9:
shl.b64 %rd26, %rd42, 3;
sub.s64 %rd27, %rd1, %rd26;
ld.local.f64 %fd54, [%rd27];
fma.rn.f64 %fd60, %fd54, %fd54, %fd60;
add.s64 %rd42, %rd42, -1;
add.s32 %r60, %r60, 1;
setp.ne.s32 %p5, %r60, 0;
@%p5 bra BB1_9;
T l[N*N];
for(int i = 0; i < N*N; ++i){
l[i] = buffer[offset+i];
}
choleskyKernel2<T,N>(l);
for(int i = 0; i < N*N; ++i){
buffer[offset+i] = l[i];
}
#include <thrust/device_vector.h>
template<typename T, int N>
__device__ inline
void choleskyKernel2(T* C){
#pragma unroll
for (int i = 0; i < N; i++){
#pragma unroll
for (int j = 0; j <= i; j++) {
double s = 0;
#pragma unroll
for (int k = 0; k < j; k++){
s += C[i*N+k] * C[j*N+k];
}
s = C[i*N+j] - s;
C[i*N+j] = (i == j) ?
sqrt(s) :
(1.0 / C[j*N+j] * (s));
}
}
}
template<typename T, int N>
__global__ static
void test3(T* buffer){
const int matrixElements = N * N;
T l[matrixElements];
for(int i = 0; i < matrixElements; ++i){
l[i] = buffer[i];
}
choleskyKernel2<T,N>(l);
for(int i = 0; i < matrixElements; ++i){
buffer[i] = l[i];
}
}
int main(){
thrust::device_vector<double> d_data(16);
test3<double,4> <<< 1,1 >>>(thrust::raw_pointer_cast(d_data.data()));
}
最佳答案
虽然我无法告诉您为什么 nvcc(或者确实代表 nvcc 执行设备代码编译的 cicc)不展开您的循环,但我可以向您展示如何更改代码以使其执行。
转动
#pragma unroll
for (int i = 0; i < N; i++){
#pragma unroll
for (int j = 0; j <= i; j++) {
#pragma unroll
for (int i = 0; i < N; i++) {
#pragma unroll
for (int j = 0; j < N; j++)
if (j <= i) {
#pragma unroll
指令。
关于cuda - NVCC 不会展开小的嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44072957/
我已经在我的电脑上安装了 CUDA 工具包,但似乎有些东西坏了。 nvcc 无法编译,像这样的简单 hello-world 也无法编译: #include int main(int argc, ch
我想知道,为什么 NVCC 无法为小矩阵 (N=4) 展开以下 Cholesky 分解内核。 template __device__ inline void choleskyKernel2(T* C)
我将 cuda sdk 5.0 安装到/opt 甚至编译了所有示例,但我无法执行 nvcc。这是一些控制台输出: 我正在使用 linux mint 13。 最佳答案 更新 我对 .bash_profi
我想将我的 CUDA 代码组织成单独的目标文件,以便在编译结束时进行链接,就像在 C++ 中一样。为此,我希望能够声明一个指向 __constant__ 的外部指针。内存在头文件中,并将定义放在 .c
NVCC 对设备代码的优化效果如何?它是否进行了诸如常量折叠和公共(public)子表达式消除之类的优化? 例如,它会减少以下内容: float a = 1 / sqrtf(2 * M_PI); fl
我正在尝试在 CUDA 中做这样的事情: char_sig=code[k][1] & 0b00000010; 而且 NVCC 编译器一直给我错误预期的“;” 相同的代码适用于 GCC C 编译器。我注
我正在尝试在 CUDA 中做这样的事情: char_sig=code[k][1] & 0b00000010; 而且 NVCC 编译器一直给我错误预期的“;” 相同的代码适用于 GCC C 编译器。我注
这个问题已经有答案了: Using CUDA with Visual Studio 2017 (9 个回答) 已关闭 6 年前。 我一直在尝试让 CUDA 在我的电脑上运行。我尝试干净(重新)安装最新
为什么编译器不做一些可以在内核中完成的简单优化?我有以下矩阵乘法代码: __global__ void matrixMultiply(float * A, float * B, float * C,
我刚刚开始在 CUDA 上编码,我试图将我的代码管理到一堆不同的文件中,但我的一个宏由于某种原因不会接受传递的参数。 错误是: addkernel.cu(19): error: identifier
请原谅我的菜鸟。我们的研究小组最近购买了一台服务器,其中装有 2 个 NVIDIA Tesla 单元,我负责设置它。 服务器单元正在运行 Rocks 6.0。 所以我根据以下说明安装从 NVIDIA
我希望 NVCC 将以下警告视为错误: warning : calling a __host__ function("foo") from a __host__ __device__ function
我有一个项目正在使用 CUDA 运行。由于各种原因,它需要编译一个可执行文件,无论是否支持 GTK,无需重新编译所有相关文件。在 C 下,我通过将对象的基本版本编译为 *.o 来完成此操作。和对象的
我在带有 GTX 570(计算能力 2.0)的 Ubuntu 10.10 上使用 CUDA 4.0,以及 GCC 编译器套件。据我了解,在编译过程中,CUDA 编译器驱动程序 nvcc 拆分了 .cu
我正在尝试在我的 GPU 上测量峰值单精度触发器,因为我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令。不幸的是,编译器正在删除所有代码,因为它实际上没有任何用处,因为我没有执行任何数据加
我需要从命令行使用 nvcc 编译 cuda .cu 文件。该文件是“vectorAdd_kernel.cu”并包含以下代码: extern "C" __global__ void VecAdd_ke
我正在尝试使用 nvcc 编译一个 .cu 程序,但每次我尝试在 Unix 中编译后,我的命令都不再有效。我得到一个错误: “命令”:找不到命令。 这是为什么呢?每次编译后我都必须注销/退出。 [编辑
我正在尝试将 nvcc 与最简单的示例一起使用,但它无法正常工作。我正在编译并执行来自 https://devblogs.nvidia.com/easy-introduction-cuda-c-and
在我的 mac(Snow Leopard) 上更新 CUDA 后,nvidia 的 nvcc 编译器在编译时表现得很奇怪: nvcc batched_gemm.cu 我收到以下编译错误,我不知道如何
我正在尝试编译一些 CUDA,我希望显示编译器警告。相当于: g++ fish.cpp -Wall -Wextra 除了 NVCC 不理解这些,你必须通过它们: nvcc fish.cu --comp
我是一名优秀的程序员,十分优秀!