【发布时间】:2012-07-25 09:10:35
【问题描述】:
给定一个 CUDA 向量类型 int4,我如何从常量内存中加载 128 位数据。
这似乎不起作用:
#include <stdio.h>
#include <cuda.h>
__constant__ int constant_mem[4];
__global__ void kernel(){
int4 vec;
vec = constant_mem[0];
}
int main(void){return 0;}
在第七行,我尝试将常量内存中的所有 4 个整数值加载到 128 位向量类型中。此操作导致以下编译错误:
vectest.cu(7): error: no operator "=" matches these operands
operand types are: int4 = int
另外,是否可以直接访问向量类型而无需强制转换,如下所示:
int data = vec[0];
PTX 程序集中的 Switch 语句:
@%p1 bra BB1_55;
setp.eq.s32 %p26, %r1, 1;
@%p26 bra BB1_54;
setp.eq.s32 %p27, %r1, 2;
@%p27 bra BB1_53;
setp.ne.s32 %p28, %r1, 3;
@%p28 bra BB1_55;
mov.u32 %r961, %r61;
bra.uni BB1_56;
BB1_53:
mov.u32 %r961, %r60;
bra.uni BB1_56;
BB1_54:
mov.u32 %r961, %r59;
bra.uni BB1_56;
BB1_55:
mov.u32 %r961, %r58;
BB1_56:
【问题讨论】:
-
请提供更多上下文。 “不起作用”是什么意思?显示未定义类型和内存空间的代码 sn-p 不是很有帮助。理想情况下,您发布的代码应该简短且完全独立。当他们不必在 cmets 中猜测或要求澄清时(就像在您的上一个问题中一样),它使那些可能会帮助您的人的工作变得更容易
-
@talonmies 对不起,我不清楚,我的意思是说代码不会编译。我已更新问题以包含编译错误。我还包含了我正在尝试编译的基本代码。
-
对于第一种情况,听起来您想要
vector = * reinterpret_cast<int4 *>(&constant_mem)之类的东西,但为什么不在第二种情况下访问 int4 中的成员呢?我在这里错过了什么吗? -
@talonmies 我已经通过实际将常量内存声明为 int4 找到了第一种情况的解决方法。对于第二种情况,我需要根据线程 ID 访问数据。所以我不能通过简单地使用vector.x、vector.y等来访问它。我可以将数据转换为整数数组,但我不确定这是否安全,它也不会很干净看着。
标签: types vector cuda structure gpgpu