我知道 Haskell 中的许多名称都受到范畴论术语的启发,我正试图准确理解类比的开始和结束位置。
Hask由于一些关于严格/懒惰和的技术细节,我已经知道这Hask不是(必然)一个类别seq,但现在让我们把它放在一边。为清楚起见,
Hask是具体类型,即 kind 的类型*。这包括像 那样的函数类型Int -> [Char],但不包括像Maybe :: * -> *. 但是,具体类型Maybe Int :: *属于Hask. 类型构造函数/多态函数更像是自然变换(或其他更一般的映射Hask到自身),而不是态射。Hask是 Haskell 函数。对于两个具体类型Aand B,hom-setHom(A,B)是具有签名的函数集A -> B。f . g。如果我们担心严格性,我们可能会将组合重新定义为严格的,或者在定义函数的等价类时要小心。Functors 是 Endofunctors Hask我认为上面的技术细节与我下面的困惑没有任何关系。我想我理解它的意思是说 的每个实例Functor都是类别中的一个内函子Hask。也就是说,如果我们有
class Functor …Run Code Online (Sandbox Code Playgroud) 我试图使用CUDA内核来修改OpenGL纹理,但我遇到一个奇怪的问题,我的调用surf2Dwrite()似乎与纹理的先前内容混合,如下图所示.在使用我的CUDA内核修改之前,背面的木质纹理是纹理中的内容.预期的输出仅包括颜色渐变,而不包括其背后的木材纹理.我不明白为什么这种混合正在发生.
我是CUDA和OpenGL的新手.在这里,我将尝试解释导致我使用此代码的思维过程:
cudaArray来访问纹理(而不是像浮点数组),因为我读到在读/写纹理时最好是缓存局部性.cudaArray 我的代码可能存在一些问题,我不知道如何检查/测试:
floats而不是unsigned chars?您可以在此GitHub Gist中找到完整的最低工作示例.由于所有活动部件都很长,但我会试着总结一下.我欢迎有关如何缩短MWE的建议.整体结构如下:
cudaGraphicsGLRegisterImage()cudaGraphicsSubResourceGetMappedArray()得到一个cudaArray代表纹理cudaSurfaceObject_t我可以用来写的cudaArraysurf2Dwrite()我是OpenGL的新手,所以我使用LearnOpenGL教程的"纹理"部分作为起点.这是我如何设置纹理(使用图像库stb_image.h)
GLuint initTexturesGL(){
// load texture from file
int numChannels;
unsigned char *data = stbi_load("img/container.jpg", &g_imageWidth, &g_imageHeight, &numChannels, 4);
if(!data){
std::cerr << "Error: Failed to load texture image!" << std::endl;
exit(1);
}
// opengl texture …Run Code Online (Sandbox Code Playgroud)